c++作用域和Windows线程
c++ scope and windows threads threads
我有一个定义了套接字的对象,在调用析构函数之前,套接字不会被关闭或关闭。然后,在实例化该对象的类中,我有一个线程,该线程执行在套接字上操作的方法之一。
我能让线程工作的唯一方法是像这样定义它:
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
为null,这使我相信这是一个作用域问题。
如何解决这个错误?
在一个有趣的方面注意到另一个线程在套接字上运行良好,似乎没有丢失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,等待线程终止,然后关闭套接字。您正在从Dac类的成员函数调用CreateThread。如果不是,这本身就是一个错误。
您是否验证了Dac对象的生命周期?任何传递给CreateThread作为lpParameter的数据必须比线程活得更长。
我解决了这个问题,void*
和LPVOID
之间存在差异,LPVOID
似乎保持了this
变量
相关文章:
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 互斥,Windows 10,c ++,在一个线程上获取,在另一个线程上发布
- 多线程Windows GUI应用程序中的死锁
- 用于线程间通信的 Windows 套接字
- 如何使用 Ryzen 7 修复 Windows 上 Qt 5.9 线程的处理器关联
- 睡眠:(睡眠或usleep)并没有将我的线程中的所有内容悬挂在Linux中,而是在Windows中悬挂吗?为什么
- 另一个应用程序用 c++ 在 Windows 上的线程中破坏 QTimer
- Malloc()/free()在Windows上的几个线程中崩溃
- 在Windows 10上使用C 中的线程(使用G 作为编译器)的问题
- 如何在 Windows 10 应用程序中访问C++默认线程池?
- std::线程在 Windows 窗体中不可用
- 在C 中将多个客户端连接到Windows中的单个服务器中的多线程
- Windows C :优先考虑线程以防止主线程被抢占
- Windows 服务中的多线程命名管道会锁定客户端
- Windows 线程池,'PTP_CALLBACK_INSTANCE':未声明的标识符
- 如何在Windows NT中获取线程的动态优先级
- 在 Linux 上为 Windows 编译多线程应用程序 [ C++ ]
- 如何将向量返回到 Windows 线程函数
- 使用C 中的Windows API使用多线程列出文件
- 通知所有活动线程(Windows)