CreateThread, долго передаваемый в lpParameter - PullRequest
0 голосов
/ 11 ноября 2011

Компилятор говорит «недопустимое косвенное обращение» в строке 3. В среде IDE «выражение должно быть указателем на полный тип объекта»

001 DWORD WINAPI MyCallbackFunction( LPVOID lpvParam )
002 {
003    long value = (long) *lpvParam;
004    ...
005    return 0;
006 }
007
008 BOOL StartMyThread( long value )
009 {
010    DWORD dwThreadId;
011    BOOL result = FALSE;
012    HANDLE hThread = NULL;
013    hThread = CreateThread(NULL, 0, MyCallbackFunction, &value, NULL, &dwThreadId );
014    result = (NULL == hThread);
015    CloseHandle( hThread );
016    return result;
017 }

Если я изменю строку 3 на эту, она компилируется, но вылетает ...

long value = (long) lpvParam;

Ответы [ 2 ]

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

Вы пытаетесь задержать указатель void*, что недопустимо.Сначала вы должны привести его к другому типу указателя.Поскольку ваш параметр является указателем на long, вам нужно сделать это вместо этого:

long *value = (long*) lpvParam;

Или, если поток не нуждается в доступе к исходной переменной:

long value = * (long*) lpvParam;

Сет прав, хотя.Исходная переменная исчезнет к тому времени, когда поток фактически начнет работать.Если вы пытаетесь передать его значение потоку, сделайте это вместо:

// notice the '&' operator is gone now...
hThread = CreateThread(NULL, 0, MyCallbackFunction, (LPVOID)value, NULL, &dwThreadId );
...    
long value = (long) lpvParam;
1 голос
/ 11 ноября 2011

Вы даете указатель на локальную переменную, которая может быть уничтожена типом, который запускает поток.Было бы лучше привести long к LPVOID при вызове к CreateThread, а затем вернуть его к long (обратите внимание, что разыменование указателя не происходит) внутри MyCallbackFunction.

...