Проблемы с использованием 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);
}
};
1 ответ
Решение
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
}