Прерывание потока и не работает ThreadExit visualstudio2008 c ++ - PullRequest
0 голосов
/ 13 января 2012

Я использую потоки в c ++ visualstudio2008, когда моя форма закрывается, поток все еще остается активным, поэтому я попробовал thread :: abort, когда форма закрывается, но после вызова потока все еще жив. поэтому я помещаю обработчик исключения в поток, и когда исключение прерывания прибывает, выход потока, но поток не входит в обработчик исключения. как я могу закрыть свою ветку? 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");
         }
     }
};
}

1 Ответ

1 голос
/ 13 января 2012

Как насчет этого:

// 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
    }
}
...