Multithreading 线程中止和线程退出不工作visualstudio2008 c++;
我在C++ VisualStudio2008中使用线程,当我的窗体关闭时,线程仍然保持活动状态,所以我尝试了线程::在窗体关闭时中止:但是在调用线程仍然活着之后。因此,我将am EXCTION处理程序放在线程中,当异常终止时,线程退出,但线程不进入异常处理程序。 我怎样才能合上我的线? oThread是一个全局对象线程Multithreading 线程中止和线程退出不工作visualstudio2008 c++;,multithreading,visual-studio-2008,c++-cli,threadabortexception,thread-abort,Multithreading,Visual Studio 2008,C++ Cli,Threadabortexception,Thread Abort,我在C++ VisualStudio2008中使用线程,当我的窗体关闭时,线程仍然保持活动状态,所以我尝试了线程::在窗体关闭时中止:但是在调用线程仍然活着之后。因此,我将am EXCTION处理程序放在线程中,当异常终止时,线程退出,但线程不进入异常处理程序。 我怎样才能合上我的线? oThread是一个全局对象线程 private: void ThreadMethod(/*Object^ state*/) { try{ SOCKET server; WSADAT
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");
}
}
};
}
像这样的怎么样:
// 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
}
}
像您一样使用循环检查变量(在您的情况下是
stop
)是一种常见的方法。你在任何地方设置了这个变量吗?是的,但我不能这样做,因为线程正在停止并侦听TCP数据包,所以我需要以其他方式停止线程。这就是我尝试使用abort或exit的原因。但是,如果您有一个包含变量和非阻塞侦听的解决方案,它将是OK使侦听套接字非阻塞,并使用选择
和一个短超时来检查侦听套接字上的活动。这样,循环将以短暂的暂停运行,这不会最大限度地提高CPU的使用率。对不起,我不是套接字专家,你能写一个简单的例子吗,就用几行代码使侦听不阻塞吗?非常感谢。