0

我在 c++ visualstudio2008 中使用线程,当我的表单关闭时,线程仍然保持活动状态,所以我在表单关闭时尝试了 thread::abort,但在调用线程后仍然存在。所以我把 am excption 处理程序放在线程中,当一个中止异常到达时线程退出,但线程没有进入异常处理程序。我怎样才能关闭我的线程?oThread 是一个全局对象 Thread。

private: void ThreadMethod(/*Object^ state*/)
{   
    try{
    SOCKET server;
    WSADATA wsaData;
    sockaddr_in local;
    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret!=0)
    {
        return;
    }
    local.sin_family=AF_INET;
    local.sin_addr.S_un.S_addr=INADDR_ANY;
    local.sin_port=htons((u_short)20248);
    server=socket(AF_INET,SOCK_STREAM,0);
    if(server==INVALID_SOCKET)
    {
        return;
    }
    if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
    {
        return;
    }
    if(listen(server,10)!=0)
    {
        return;
    }
    SOCKET client;
    sockaddr_in from;
    int fromlen=sizeof(from);
    int buffer;
    char buff;
    //this->Invoke(gcnew MethodInvoker(this, &Form1::UpdateButton));
    while(!stop)
    {
        client=accept(server,(struct sockaddr*)&from,&fromlen);
        //con la struct
        int numByte=recv(client,(char*) &mystruct, (int) sizeof(mystruct), 0);
        this->Invoke(gcnew MethodInvoker(this, &Form1::UpdateButton));
        MessageBox::Show(mystruct.num.ToString());
        closesocket(client);

    }
    closesocket(server);
    WSACleanup();
    }
    catch (ThreadAbortException^ e) 
    {
        ExitThread(0);
    }
    ExitThread(0);
}

private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {     
         oThread->Abort(); 
         if(oThread->IsAlive)
         {
             MessageBox::Show("ok");
         }
     }
};
}
4

1 回答 1

1

像这样的东西怎么样:

// Make socket non-blocking
int mode = 1;
ioctlsocket(server, FIONBIO, &mode);

struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100000;  // 0.1 second

FD_SET server_set;

while (!stop)
{
    FD_ZERO(&server_set);
    FD_SET(server, &server_set);

    if (select(server + 1, &server_set, 0, 0, &timeout) == SOCKET_ERROR)
    {
        // Error handling
    }

    if (FD_ISSET(server, &server_set))
    {
        // Call accept and all the other stuff
    }
}
于 2012-01-13T08:49:00.247 回答