c++ - 在成员函数上使用 CreateThread 的问题

标签 c++ multithreading createthread

我试图在一个对象中创建一个线程,但是我得到一个错误提示 '&' : illegal operation on bound member function expression. 读起来我看到我必须创建成员函数静态的,但是当我这样做时,我收到一条错误消息,提示 left of '.dac_ping' must have class/struct/union

这就是我正在尝试的:

class Dac 
    {
    private:
        network_com com;
        HANDLE  ping_thread;
        DWORD   dping_thread;

        static DWORD WINAPI ping_loop(void* param)
            {
            while ( com.dac_ping() == 0)
                Sleep(900);

            return 1; //since this is an infinite loop, if the loop breaks, it has failed
            }


    public:
        Dac()
            {
            }

        ~Dac()
            {
            }

        void find_dac()
            {
            com.find_dac();
            com.print_dac_info();
            }


        void connect_and_keep_alive()
            {
            if (com.dac_connect() == 0)
                ping_thread = CreateThread (NULL , 0, ping_loop, NULL, 0, &dping_thread);
            }

    };

最佳答案

static 函数不绑定(bind)到特定实例;没有 this 指针,也没有“成员变量”。您可以将 this 指针作为参数传递给您的函数,然后将其转换为 Dac* 并从中访问成员变量。

所以你可以这样做

ping_thread = CreateThread (NULL , 0, ping_loop, (LPVOID)this, 0, &dping_thread);

并将您的 ping_loop 更改为:

static DWORD WINAPI ping_loop(void* param)
{
    Dac* dac = (Dac*)param;
    while ( dac->com.dac_ping() == 0)
        Sleep(900);

    return 1; //since this is an infinite loop, if the loop breaks, it has failed
}

关于c++ - 在成员函数上使用 CreateThread 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025049/

相关文章:

c# - 如何从另一个线程更新 GUI?

c - 难以通过 pthread_create 传递结构

c++ - 正则表达式误解或只是破坏了实现?

c++ - 我怎么知道一个目录是VB6中的回收站?

java - 在 Java 中识别和处理锁定线程的最佳方法

c - 使用 POSIX 消息队列的单进程线程安全

c++ - 糟糕 : the __cmp__ function

c++ - 这个 CMake 错误是什么意思?我的变量设置为 NOTFOUND

c++ - 将套接字句柄传递给线程时,recvfrom() 返回错误 10022

c++ - 在 C++ 中执行主程序时,如何在后台检查是否已经过了一分钟?