我有一个定义了套接字的对象,在调用析构函数之前,套接字不会关闭或关闭。然后在实例化该对象的类中,我有一个线程执行在套接字上操作的方法之一。
我能让线程工作的唯一方法是像这样定义它:
static DWORD WINAPI writePoints(void* param)
{
resume
Dac *dac = (Dac*)param;
//...
dac->com->write_data(dac->d,BUF_PTS,pr);
//...
}
线程是从同一个类创建的
write_thread = CreateThread(NULL, 0, writePoints,(void*)this, 0, &dwrite_thread);
但是当涉及到运行对套接字进行操作的代码时,它根本不起作用。相反,我收到一条错误消息,指出套接字不是套接字。但它在线程外工作得很好。设置断点后,我看到 this
为空,这让我相信这是一个范围问题。
如何解决此错误?
有趣的是,另一个在套接字上运行的线程工作正常并且似乎没有丢失 this
另一个工作线程是这样定义的
static DWORD WINAPI ping_loop(void* param)
{
Dac *dac = (Dac*)param;
if (dac->com->connected())
while (dac->com->dac_ping() == 0)
Sleep(980);
ExitThread(1);
return 1;
}
主要区别似乎是 ping_loop
没有传递任何参数
最佳答案
我猜你没有在 Dac 析构函数中等待,直到线程终止。如果 main 函数足够短和简单,很可能你的应用程序用完了 main 函数并且调用了 Dac 类的析构函数,但 Dac 创建的线程仍在运行。
在析构函数中使用WaitForSingleObject,等待线程终止,然后关闭套接字。
关于c++ 范围和 windows 线程线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058724/