c++作用域和Windows线程

c++ scope and windows threads threads

本文关键字:线程 Windows 作用域 c++      更新时间:2023-10-16

我有一个定义了套接字的对象,在调用析构函数之前,套接字不会被关闭或关闭。然后,在实例化该对象的类中,我有一个线程,该线程执行在套接字上操作的方法之一。

我能让线程工作的唯一方法是像这样定义它:

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变量