У меня есть объект с определенным сокетом, сокет не отключается и не закрывается, пока не будет вызван деструктор.Затем в классе, который создает экземпляр этого объекта, у меня есть поток, который выполняет один из методов, работающих с сокетом.
Единственный способ заставить поток работать, это определить его следующим образом:
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
не передает никаких аргументов