Проблема с параметром CreateThread в Visual C ++ - PullRequest
0 голосов
/ 17 мая 2010

У меня есть класс, который содержит функцию, которая вызывает создание потока, и должен передать себя (это) в качестве параметра:

DWORD threadId;
HANDLE h = CreateThread( NULL, 0, runThread, this, 0, &threadId);

Мое определение runThread выглядит следующим образом:

DWORD WINAPI runThread(LPVOID args)
{
    Obj *t = (Obj*)args;
    t->funct();
    return 0;
}

К сожалению, объект t, который я получаю в runThread (), получает мусор. Мой класс Obj имеет атрибут указателя на функцию. Может ли это быть проблемой?

class Obj{
    void(*funct)();

и в конструкторе:

Obj(void(*f)())
{
    funct = f;
}

где моя ошибка? Указатель на функцию, сам createThread или приведение типов? Я попробовал все, что мог придумать.

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Объект был создан в моем основном потоке выполнения. Ошибка заключалась в том, что объект выходил из области видимости на две строки в этом потоке, поэтому при выполнении потока по адресу был только мусор.

1 голос
/ 17 мая 2010

Предполагая, что объект был правильно сконструирован, есть ли вероятность того, что объект, создающий поток, вышел из области видимости после вызова CreateThread? Это оставит ваш поток с мусорным объектом. Если нет, выполните один шаг по коду с помощью отладчика и посмотрите на указатель «this» объектов при вызове потока, а точку останова в начале потока посмотрите, что он получает как параметры.

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