VC++多线程的参数问题
我使用CreateThread来创建线程,这个函数的第四个参数好像是LPVOIDlpParameter一个指向void的指针,这个参数将被传递到线程函数里,可是不管我传递...
我使用CreateThread来创建线程,这个函数的第四个参数好像是LPVOID lpParameter 一个指向void的指针,这个参数将被传递到线程函数里,可是不管我传递什么样的参数,编译的时候总是显示无法将其他类型的指针转换成LPVOID类型。请问这是为什么?应该如何向线程函数传递参数?
谢谢!
貌似还是有点问题。
如果强制转换成void*类型的指针,那么我在线程函数里就无法引用指针所指向的变量了。因为无法引用一个void类型的变量啊? 展开
谢谢!
貌似还是有点问题。
如果强制转换成void*类型的指针,那么我在线程函数里就无法引用指针所指向的变量了。因为无法引用一个void类型的变量啊? 展开
展开全部
使用CreateThread传递的参数必须是一个指针(一般是一个指向结构或者类的指针),不需要强制转化就可以。
在ThreadProc中使用这个参数时要强制转化为它原本的类型就可以了。
可以参考如下代码:
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#define MAX_THREADS 3
#define BUF_SIZE 255
typedef struct MyData {
int val1;
int val2;
} MYDATA, *PMYDATA;
DWORD WINAPI MyThread( LPVOID lpParam )
{
HANDLE hStdout;
PMYDATA pData;
TCHAR msgBuf[BUF_SIZE];
size_t cchStringSize;
DWORD dwChars;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( hStdout == INVALID_HANDLE_VALUE )
return 1;
// Cast the parameter to the correct data type.
pData = (PMYDATA)lpParam;
// Print the parameter values using thread-safe functions.
StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
pData->val1, pData->val2);
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL);
return 0;
}
int _tmain()
{
PMYDATA pData;
DWORD dwThreadId[MAX_THREADS];
HANDLE hThread[MAX_THREADS];
int i;
// Create MAX_THREADS worker threads.
for( i=0; i<MAX_THREADS; i++ )
{
// Allocate memory for thread data.
pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
if( pData == NULL )
ExitProcess(2);
// Generate unique data for each thread.
pData->val1 = i;
pData->val2 = i+100;
hThread[i] = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThread, // thread function
pData, // argument to thread function
0, // use default creation flags
&dwThreadId[i]); // returns the thread identifier
// Check the return value for success.
// If failure, close existing thread handles,
// free memory allocation, and exit.
if (hThread[i] == NULL)
{
for(i=0; i<MAX_THREADS; i++)
{
if (hThread[i] != NULL)
{
CloseHandle(hThread[i]);
}
}
HeapFree(GetProcessHeap(), 0, pData);
ExitProcess(i);
}
}
// Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
// Close all thread handles and free memory allocation.
for(i=0; i<MAX_THREADS; i++)
{
CloseHandle(hThread[i]);
}
HeapFree(GetProcessHeap(), 0, pData);
return 0;
}
在ThreadProc中使用这个参数时要强制转化为它原本的类型就可以了。
可以参考如下代码:
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#define MAX_THREADS 3
#define BUF_SIZE 255
typedef struct MyData {
int val1;
int val2;
} MYDATA, *PMYDATA;
DWORD WINAPI MyThread( LPVOID lpParam )
{
HANDLE hStdout;
PMYDATA pData;
TCHAR msgBuf[BUF_SIZE];
size_t cchStringSize;
DWORD dwChars;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( hStdout == INVALID_HANDLE_VALUE )
return 1;
// Cast the parameter to the correct data type.
pData = (PMYDATA)lpParam;
// Print the parameter values using thread-safe functions.
StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
pData->val1, pData->val2);
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL);
return 0;
}
int _tmain()
{
PMYDATA pData;
DWORD dwThreadId[MAX_THREADS];
HANDLE hThread[MAX_THREADS];
int i;
// Create MAX_THREADS worker threads.
for( i=0; i<MAX_THREADS; i++ )
{
// Allocate memory for thread data.
pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
if( pData == NULL )
ExitProcess(2);
// Generate unique data for each thread.
pData->val1 = i;
pData->val2 = i+100;
hThread[i] = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThread, // thread function
pData, // argument to thread function
0, // use default creation flags
&dwThreadId[i]); // returns the thread identifier
// Check the return value for success.
// If failure, close existing thread handles,
// free memory allocation, and exit.
if (hThread[i] == NULL)
{
for(i=0; i<MAX_THREADS; i++)
{
if (hThread[i] != NULL)
{
CloseHandle(hThread[i]);
}
}
HeapFree(GetProcessHeap(), 0, pData);
ExitProcess(i);
}
}
// Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
// Close all thread handles and free memory allocation.
for(i=0; i<MAX_THREADS; i++)
{
CloseHandle(hThread[i]);
}
HeapFree(GetProcessHeap(), 0, pData);
return 0;
}
展开全部
传递给CreateThread参数的指针一定要是全局的或new出来的,否则根本就没传进去就被释放了
传的时候(LPVOID)类型转换下就行了
传的时候(LPVOID)类型转换下就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
强制转换一下就可以了,都是这样做的。
CreateThread(..., (void*)g_ulMainThreadId, ...);
正规一点的也可以用宏如:ULONG g_ulMainThreadId;//主线程ID
CreateThread(..., ULongToPtr(g_ulMainThreadId), ...);
============================================================
补充:
传进去的参数,在线程里再转换回来就可以了。 任何类型都可以传,没有局限于指针的限制。
ULong g_ulMainThreadId = (PtrToULong)lpVoid; //(ULong)lpVoid
不怕不能用,就怕想不到。
CreateThread(..., (void*)g_ulMainThreadId, ...);
正规一点的也可以用宏如:ULONG g_ulMainThreadId;//主线程ID
CreateThread(..., ULongToPtr(g_ulMainThreadId), ...);
============================================================
补充:
传进去的参数,在线程里再转换回来就可以了。 任何类型都可以传,没有局限于指针的限制。
ULong g_ulMainThreadId = (PtrToULong)lpVoid; //(ULong)lpVoid
不怕不能用,就怕想不到。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询