проблемы с использованием CreateThread на функцию-член - PullRequest
1 голос
/ 06 ноября 2011

Я пытаюсь создать поток в объекте, однако я получаю сообщение об ошибке: '&' : 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);
            }

    };

1 Ответ

4 голосов
/ 06 ноября 2011

static функции не привязаны к конкретному экземпляру; указатель 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
}
...