Thread Abort y ThreadExit no funciona VisualStudio2008 C ++
Pregunta
Estoy usando hilos en C ++ VisualStudio2008, cuando mi forma cierra el hilo aún permanece activo, así que probé el hilo :: Abort cuando el formulario se está cerrando, pero después de llamar sobre el hilo todavía está vivo. Así que puse el manejador de excepción en el hilo y cuando llega una excepción de aborto, la salida del hilo, pero el hilo no ingresa en el controlador de excepciones. ¿Cómo puedo cerrar mi hilo? Othread es un hilo de objeto global.
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");
}
}
};
}
Solución
Qué tal algo como esto:
// 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
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow