2015-05-26 3 views
0

Я попытался реализовать передачу данных между usb и CPU в этом проекте. Передача данных показана как маленький прямоугольник, перемещающийся от одного компонента компьютера к другому.Почему функция GlutPostRedisplay и sleep не работает в этом коде?

В приведенном ниже коде GlutPostRedisplay не работает.

Кроме того, может ли кто-нибудь сказать мне, является ли функция sleep() правильной, потому что функции, вызываемые на дисплее, не работают синхронно. casing() никогда не выполняется. После fisrtscreen() он сразу перескакивает на open() и работает() не работает.

Какая ошибка с этим кодом?

void operate() 
{ 
    URLTEXTX = 200; 
    URLTEXTY = 950; 
    displayString(READUSB,1); 
    //southbrigde to northbrigde 
    bottom(488.0,425.0,380.0); 
    back(488.0,188.0,380.0); 
    top(188.0,380.0,550.0); 
    //northbridge to cpu 
    front(230.0,350.0,595.0); 
    top(345.0,600.0,650.0); 
    //read from usb 
    back(700.0,625.0,465.0); 
    bottom(625.0,460.0,385.0); 
    back(620.0,525.0,390.0); 
    sleep(1); 

    URLTEXTX = 200; 
    URLTEXTY = 950; 
    displayString(WRITEUSB,1); 
    //cpu to northbridge 
    bottom(350.0,650.0,595.0); 
    back(350.0,230.0,600.0); 
    //northbridge to southbridge 
    bottom(188.0,550.0,380.0); 
    front(188.0,488.0,380.0); 
    top(483.0,380.0,425.0); 
    //write to usb 
    front(525.0,625.0,385.0); 
    top(625.0,385.0,460.0); 
    front(620.0,700.0,460.0); 
    sleep(1); 

    URLTEXTX = 200; 
    URLTEXTY = 950; 
    displayString(READDVD,1); 
    //read from dvd 
    back(600.0,560.0,810.0); 
    bottom(570.0,810.0,600.0); 
    back(560.0,525.0,610.0); 
    //ram to northbridge 
    back(450.0,230.0,580.0); 
    //northbridge to cpu 
    front(230.0,350.0,595.0); 
    top(345.0,600.0,650.0); 
    sleep(1); 

    URLTEXTX = 200; 
    URLTEXTY = 950; 
    displayString(WRITEDVD,1); 
    //cpu to northbridge 
    bottom(350.0,650.0,595.0); 
    back(350.0,230.0,600.0); 
    //northbridge to ram 
    front(230.0,450.0,580.0); 
    //write to dvd 
    front(525.0,570.0,600.0); 
    top(570.0,600.0,800.0); 
    front(560.0,600.0,800.0); 
    sleep(1); 

    URLTEXTX = 200; 
    URLTEXTY = 950; 
    displayString(READHD,1); 
    //read from hard disc 
    back(640.0,560.0,300.0); 
    top(560.0,300.0,530.0); 
    back(560.0,525.0,530.0); 
    //ram to northbridge 
    back(450.0,230.0,580.0); 
    //northbridge to cpu 
    front(230.0,350.0,595.0); 
    top(345.0,600.0,650.0); 
    sleep(1); 

    URLTEXTX = 200; 
    URLTEXTY = 950; 
    displayString(WRITEHD,1); 
    //cpu to northbridge 
    bottom(350.0,650.0,595.0); 
    back(350.0,230.0,600.0); 
    //northbridge to ram 
    front(230.0,450.0,580.0); 
    //write to hard disc 
    front(525.0,560.0,530.0); 
    bottom(560.0,530.0,300.0); 
    front(560.0,640.0,300.0); 
    sleep(1); 
} 
void front(GLfloat x1,GLfloat x2,GLfloat y1)//to move in forward direction       
{ 
    GLfloat i; 
    for(i=x1;i<=x2;i++) 
    { 
     drawbit(i,x1+5,y1,y1-5); 
     glutPostRedisplay(); 
    } 

} 
void back(GLfloat x1,GLfloat x2,GLfloat y1)//to move in backward direction 
{ 
    GLfloat i; 
    for(i=x1;i>=x2;i--) 
    { 
     drawbit(i,i-5,y1,y1-5); 
     glutPostRedisplay(); 
    } 

} 
void top(GLfloat x1,GLfloat y1,GLfloat y2)//to move in upward direction 
{ 
    GLfloat i; 
    for(i=y1;i<=y2;i++) 
    { 
     drawbit(x1,x1+5,i,i+5); 
     glutPostRedisplay(); 
    } 
} 
void bottom(GLfloat x1,GLfloat y1,GLfloat y2)//to move in downward direction 
{ 
    GLfloat i; 
    for(i=y1;i>=y2;i--) 
    { 
     drawbit(x1,x1-5,i,i-5); 
     glutPostRedisplay(); 
    } 
} 
void drawbit(GLfloat x1,GLfloat x2,GLfloat y1,GLfloat y2) 
{ 
     glBegin(GL_POLYGON); 
     glColor3f(1.0,1.0,1.0); 
     glVertex2f(x1,y1); 
     glVertex2f(x2,y1); 
     glVertex2f(x2,y2); 
     glVertex2f(x1,y2); 
     glEnd(); 
     glFlush(); 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    firstscreen(); //introduction to the project 
    sleep(3); 
    glClear(GL_COLOR_BUFFER_BIT); 
    casing(); //cpu case 
    sleep(2); 
    glClear(GL_COLOR_BUFFER_BIT); 
    opened(); //when cpu case is opened shows internal components 
    sleep(1); 
    operate(); //data transfer between various components 
} 

ответ

0

Проблема похожа на это: Pausing in OpenGL successively

glutPostRedisplay просто устанавливает флаг в перенасыщения для вызова дисплея обратного вызова на следующем цикле. На самом деле ничего не рисует.

Функция, я подозреваю, что вы находитесь после этого glutSwapBuffers. Без двойной буферизации геометрия рисуется непосредственно на экране (хотя команды «рисовать» на GPU буферизуются, для чего вы хотите glFlush). Это обычно вызывает мерцание, потому что вы видите вещи, которые позже покрываются более близкой геометрией (из-за буфера глубины). Двойная буферизация решает это путем визуализации в буфер вне экрана, а затем отображает результат сразу. Убедитесь, что GLUT_DOUBLE передано glutInit, так что у вас есть задний буфер.

Пока вы находитесь sleep() ing, ваше приложение не сможет захватывать и обрабатывать события. Допустим, вы хотите закрыть окно. До тех пор, пока сон не вернется, все будет неактуально. Сон все еще может быть важен, поэтому вы не зацикливаете свой процессор. Я бы разделил эти понятия.

  1. Петля/опрос с функцией idle до истечения времени задержки. Затем позвоните glutPostRedisplay. Добавьте glutSwapBuffers в display, если вы используете двойную буферизацию.
  2. Напишите framerate limiter, который вызывает сон, чтобы вы не зацикливали циклы.

Простой способ сделать различные вещи после набора задержек написать небольшую государственную машину ...

int state = STATE_INIT; 
float timer = 0.0f; 

void idle() 
{ 
    //insert framerate limiter here 

    //calculate time since last frame, perhaps using glutGet(GLUT_ELAPSED_TIME) 
    float deltaTime = ... 

    timer -= deltaTime; 
    if (timer < 0.0f) 
    { 
     switch (state) 
     { 
     case STATE_INIT: 
      state = STATE_DRAW_FIRST_THING; 
      timer = 123.0f; 
     ... 
     } 
     glutPostRedisplay(); 
    } 
} 

void display() 
{ 
    ... 
    if (state == STATE_DRAW_FIRST_THING) 
    { 
     ... 
    } 
    ... 
    glutSwapBuffers(); 
} 

Как ваше приложение становится все больше в этом я сомневаюсь, что это будет ремонтопригодны, и вы хотите что-то более надежное, но до этого это хорошее начало.

Простое изменение функции обратного вызова в idle сэкономит некоторое жесткое кодирование в display. Возможно, вы захотите создать объект, ориентированный на state machine. Помимо логических состояний вы можете захотеть взглянуть на интерполяцию анимации и ключевого кадра. Вместо жесткого кода все, хранение геометрии, ключевых кадров и последовательностей состояний в файле является хорошим способом разделения кода и данных. XML очень приятно работать для этого, если вы используете библиотеку.

Смежные вопросы