c++ 范围和 windows 线程线程

标签 c++ multithreading winapi scope

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

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

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/

相关文章:

java - 如何在Android应用程序中重复调用函数?

java - Android Thread 方法是否隐式同步?

c++ - 如何生成 setter 和 getter,并使用 C++ 预处理器定义 Q_PROPERTY()

C++ 内联模板策略函数

multithreading - QThread 中的 Worker

c++ - 我可以在同一个进程中使用同一个 DLL 的两个不兼容版本吗?

c# - 如何访问隐藏的分区/卷

windows - 等待程序的最后一个实例

c++ - Jsoncpp 没有正确读取指数

c++ - 什么时候将类的引用分配给其父类的实例?