С ++ область видимости и темы потоков Windows - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть объект с определенным сокетом, сокет не отключается и не закрывается, пока не будет вызван деструктор.Затем в классе, который создает экземпляр этого объекта, у меня есть поток, который выполняет один из методов, работающих с сокетом.

Единственный способ заставить поток работать, это определить его следующим образом:

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 не передает никаких аргументов

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Думаю, вы не подождали в деструкторе Dac, пока поток не завершился.Если функция main короткая и достаточно простая, вполне возможно, что ваше приложение исчерпало основную функцию и был вызван деструктор класса Dac, но поток, созданный Dac, все еще работает.

Использование WaitForSingleObject в деструкторе, дождитесь завершения потока и закройте сокет.

0 голосов
/ 09 ноября 2011

Я решил эту проблему, есть разница между void* и LPVOID, LPVOID, кажется, поддерживает переменную this

0 голосов
/ 09 ноября 2011

Вы вызываете CreateThread из функции-члена класса Dac . Если нет, то это ошибка сама по себе.

Проверено ли время жизни объекта Dac ? Любые данные, переданные CreateThread как lpParameter , должны пережить поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...