我有一个定义了套接字的对象,在调用析构函数之前,套接字不会关闭或关闭。然后在实例化该对象的类中,我有一个线程来执行在套接字上操作的方法之一。
我能让线程工作的唯一方法就是让它像这样定义:
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
没有传递任何参数
答案 0 :(得分:1)
猜猜你没有在Dac析构函数中等待,直到线程终止。如果main函数简短而且很简单,很可能你的应用程序用完了主函数,并且调用了Dac类的析构函数,但是Dac创建的线程仍在运行。
在析构函数中使用 WaitForSingleObject ,等待线程终止,然后关闭套接字。
答案 1 :(得分:0)
您正在从 Dac 类的成员函数调用CreateThread。如果不是那个本身就是一个错误。
您是否验证了 Dac 对象的生命周期?传递给 CreateThread 的任何数据 lpParameter 必须比线程更长。
答案 2 :(得分:0)
我解决了这个问题,void*
和LPVOID
之间存在差异,LPVOID
似乎维持this
变量