CreateThread传递long到lpParameter

时间:2011-11-11 19:17:22

标签: c++ visual-c++-2010

编译器在第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 个答案:

答案 0 :(得分:4)

您正在尝试使用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 :(得分:1)

您正在给出一个指向本地变量的指针,该变量可以被线程运行的类型销毁。最好在long的调用中将LPVOID转换为CreateThread,然后将其强制转换为long(请注意,没有指针取消引用发生)MyCallbackFunction内。