为什么点击Start按钮之后,界面最小化,然后就无法最大化/一般化显示了???
应该如何用线程处理?大家帮帮忙啊
代码如下://start the task
void CDoc2TifServerDlg::OnStartOK() //这是一个Start按钮
{
// TODO: Add your control notification handler code here
ShowWindow(SW_MINIMIZE);
m_TifServer.Init();
m_TifServer.StartProcessTask();
m_TifServer.Destroy();
}//StartProcessTask()
bool CTifServer::StartProcessTask()
{
SOCKET listenfd,connectfd;
int ret;
struct sockaddr_in server;
struct timeval m_tv;
FD_SET rfdListen; m_tv.tv_sec = 1;
m_tv.tv_usec = 0;
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
TRACE("Create socket failed\r\n");
int error = GetLastError();
return false;
} memset(&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(LISTEN_PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == SOCKET_ERROR)
{
TRACE("Bind socket failed\r\n");
return false;
} if(listen(listenfd,5) == SOCKET_ERROR)
{
TRACE("Listen socket failed\r\n");
return false;
} for(;;) //waiting for accepting from network
{
FD_ZERO(&rfdListen);
FD_SET(listenfd,&rfdListen);
ret = select(1,(fd_set FAR *)&rfdListen,NULL,NULL,&m_tv);
if(ret == 0) // timeout
{
continue;
}
else if(ret == SOCKET_ERROR)
{
TRACE("Select socket failed\r\n");
break;
} if((connectfd = accept(listenfd,NULL,NULL))==INVALID_SOCKET)
{
TRACE("accept socket failed\r\n");
break;
}
else
{
ProcessTask(connectfd);
}
}
closesocket(listenfd);
TRACE("listen socket over");
return true;
}
应该如何用线程处理?大家帮帮忙啊
代码如下://start the task
void CDoc2TifServerDlg::OnStartOK() //这是一个Start按钮
{
// TODO: Add your control notification handler code here
ShowWindow(SW_MINIMIZE);
m_TifServer.Init();
m_TifServer.StartProcessTask();
m_TifServer.Destroy();
}//StartProcessTask()
bool CTifServer::StartProcessTask()
{
SOCKET listenfd,connectfd;
int ret;
struct sockaddr_in server;
struct timeval m_tv;
FD_SET rfdListen; m_tv.tv_sec = 1;
m_tv.tv_usec = 0;
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
TRACE("Create socket failed\r\n");
int error = GetLastError();
return false;
} memset(&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(LISTEN_PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == SOCKET_ERROR)
{
TRACE("Bind socket failed\r\n");
return false;
} if(listen(listenfd,5) == SOCKET_ERROR)
{
TRACE("Listen socket failed\r\n");
return false;
} for(;;) //waiting for accepting from network
{
FD_ZERO(&rfdListen);
FD_SET(listenfd,&rfdListen);
ret = select(1,(fd_set FAR *)&rfdListen,NULL,NULL,&m_tv);
if(ret == 0) // timeout
{
continue;
}
else if(ret == SOCKET_ERROR)
{
TRACE("Select socket failed\r\n");
break;
} if((connectfd = accept(listenfd,NULL,NULL))==INVALID_SOCKET)
{
TRACE("accept socket failed\r\n");
break;
}
else
{
ProcessTask(connectfd);
}
}
closesocket(listenfd);
TRACE("listen socket over");
return true;
}
for(;;) //waiting for accepting from network
死循环等待连接,应开一个线程来等待网络连接,界面才能正常更新。
DWORD threadProc()
{
//for循环里的内容
}
是不是这样?
bool CTifServer::StartProcessTask()
{
DWORD ThreadID;
CWinThread* pThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadProc,NULL,0,&ThreadID);}
void CTifServer::ProcessTask(SOCKET connectfd)
{
char recvbuf[512],sendbuf[64];
CString str;
int num,ret;
struct timeval m_tv;
FD_SET rfdConnect;
memset(sendbuf,0,64);
memset(recvbuf,0,512);
strcpy(sendbuf,"ok"); for(;;)
{
FD_ZERO(&rfdConnect);
FD_SET(connectfd,&rfdConnect);
ret = select(1,(fd_set FAR *)&rfdConnect,NULL,NULL,&m_tv);
if(ret == 0) // timeout
{
continue;
}
else if(ret == SOCKET_ERROR)
{
TRACE("Select socket failed\r\n");
break;
} num = recv(connectfd,recvbuf,512,0);
if(num == 0)
{
closesocket(connectfd);
TRACE("recv socket which already had benn closed\r\n");
break;
}
if(num > 0)
{
CString fileName(recvbuf,num);
if(!printFile(fileName))
strcpy(sendbuf,"failed");
}
else
{
closesocket(connectfd);
TRACE("recv socket failed\r\n");
break;
} num = send(connectfd,sendbuf,strlen(sendbuf),0); if(num == SOCKET_ERROR)
{
closesocket(connectfd);
TRACE("send socket failed\r\n");
}
break;
}
closesocket(connectfd);
}