0

アイドル関数で線の両端座標を設定した状態でOpenGLで線を引こうとしているのですが、ソケットを使ってネットワーク経由で端点座標を送信している最中に線が引けません。以下はコードのスナップです

int  main(int argc, char **argv) 
{
glutInit(&argc,argv);
glutInitWindowSize( 1024,1024);       /* A x A pixel screen window  */

glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE);
glutCreateWindow("Skeleton Tracker"); /* window title                   */
glutDisplayFunc(display);         /* tell OpenGL main loop what     */
glutIdleFunc(idle);

//first create the connection then we wil talk about the data transfer...
 /*****Code for server connection *****/

processRequest();
return 0;
}

void processrequest()
{
byte_sent = send(ClientSocket,(char*)&msg_pkt,sizeof(MSG_PACKET),0);
ofile<<"\nByte sent for start generating "<<byte_sent<<endl;
Sleep(1000);

memset(buf,0,sizeof(buf));

glutMainLoop(); 
}

void display(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);                
glClear(GL_COLOR_BUFFER_BIT);     /* clear the window */
glColor3f ( 0.0, 1.0 , 0.0);       /* draw in light red */
glBegin(GL_LINES);
glVertex2f(x[0] , y[0]);
glVertex2f(x[1] , y[1]);
glEnd();

glEnd();
glFlush();

}


void idle(void)
{

printf("\nIn Idle function\n");

nRetVal = recv(ClientSocket , (char*)mainbuf , 192,0);

printf("\nAmount of data received : %d\n" , nRetVal);
memcpy(buf , mainbuf ,  sizeof(buf));   //buf is of 8 bytes to hold 2 floating nos.

memcpy( &x[p] ,buf , 4); // upto 3
x[p] = x[p]/10.0;

memcpy( &y[p] ,buf+4 , 4); //upto 7
y[p] = y[p]/10.0;

glutPostRedisplay();

  } 
4

2 に答える 2

0

プログラムの設計には疑問があります。アイドル関数にrecv()関数をブロックしていますが、これは適切ではありません。レンダリングに影響を与えないように、アイドルはできるだけ高速にする必要があります。

レンダリング用に1つのスレッドを作成し、ネットワーク通信用に2つ目のスレッドを作成することを検討するか、少なくともアイドル関数でブロック不可能なrecv()を使用して、ソケットから読み取る(受信する)前に、ソケットに使用可能なデータがあるかどうかを確認します。

于 2012-09-10T08:45:22.197 に答える
0

お時間をいただきありがとうございます...実際には、glutMainloopを呼び出す前に正投影行列を定義するのを忘れています...

gluOrtho2D( -250, 250, -250, 250);

その作業は今。

于 2012-09-10T09:14:36.787 に答える