CreateThread将long传递给lpParameter
CreateThread passing long to lpParameter
编译器在第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;
您正在尝试遵从void*
指针,这是不允许的。您必须首先将其强制转换为另一种指针类型。由于参数是指向long
的指针,因此您需要这样做:
long *value = (long*) lpvParam;
或者,如果线程不需要访问原始变量:
long value = * (long*) lpvParam;
Seth是对的。原来的变量将在线程实际开始运行时消失。如果您试图将其值传递给线程,请这样做:
// notice the '&' operator is gone now...
hThread = CreateThread(NULL, 0, MyCallbackFunction, (LPVOID)value, NULL, &dwThreadId );
...
long value = (long) lpvParam;
你给出了一个指向局部变量的指针,该变量可以被线程运行的类型销毁。最好在调用CreateThread
时将long
转换为LPVOID
,然后在MyCallbackFunction
内将其转换回long
(注意没有指针解引用发生)。
相关文章:
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 从 long 转换C++位集构造函数的复杂性是多少?
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 以0开头的值初始化long-long会导致奇怪的值
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- cudaMallocManaged with vector<complex<long double> > C++ - NVIDIA CUDA
- 为什么我的函数返回 long long 返回 705032704?
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 替换 c++ 中的 c 样式强制转换 (long&)
- 如何在 Turbo C++ 3.2 编译器中使用 long long 关键字
- CreateThread将long传递给lpParameter