为什么点击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;
}

解决方案 »

  1.   

    因为CTifServer::StartProcessTask()中
    for(;;)  //waiting for accepting from network
    死循环等待连接,应开一个线程来等待网络连接,界面才能正常更新。
      

  2.   

    我以前没玩过VC,对线程只是理论上的了解,用CreateThread来建一个新的?在哪建比较合适?
      

  3.   

    CWinThread*p=CreateThread(NULL,0,threadProc,0...)
    DWORD threadProc()
    {
    //for循环里的内容
    }
    是不是这样?
      

  4.   

    把CTifServer::StartProcessTask()都放到threadProc中执行
      

  5.   

    为什么总是出错'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)'
    bool CTifServer::StartProcessTask()
    {
    DWORD ThreadID;
    CWinThread* pThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadProc,NULL,0,&ThreadID);}
      

  6.   

    ProcessTask(connectfd); 函数是不是也要另外建立一个线程?//
    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);
    }