VC++多线程的参数问题

我使用CreateThread来创建线程,这个函数的第四个参数好像是LPVOIDlpParameter一个指向void的指针,这个参数将被传递到线程函数里,可是不管我传递... 我使用CreateThread来创建线程,这个函数的第四个参数好像是LPVOID lpParameter 一个指向void的指针,这个参数将被传递到线程函数里,可是不管我传递什么样的参数,编译的时候总是显示无法将其他类型的指针转换成LPVOID类型。请问这是为什么?应该如何向线程函数传递参数?
谢谢!
貌似还是有点问题。
如果强制转换成void*类型的指针,那么我在线程函数里就无法引用指针所指向的变量了。因为无法引用一个void类型的变量啊?
展开
 我来答
魔高丈
推荐于2016-03-31 · TA获得超过9506个赞
知道大有可为答主
回答量:2066
采纳率:0%
帮助的人:3469万
展开全部
使用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;
}
178752468
2009-02-26 · TA获得超过291个赞
知道小有建树答主
回答量:517
采纳率:0%
帮助的人:396万
展开全部
传递给CreateThread参数的指针一定要是全局的或new出来的,否则根本就没传进去就被释放了

传的时候(LPVOID)类型转换下就行了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
silvergingko
2009-02-26 · TA获得超过5945个赞
知道小有建树答主
回答量:688
采纳率:0%
帮助的人:869万
展开全部
强制转换一下就可以了,都是这样做的。
CreateThread(..., (void*)g_ulMainThreadId, ...);
正规一点的也可以用宏如:ULONG g_ulMainThreadId;//主线程ID
CreateThread(..., ULongToPtr(g_ulMainThreadId), ...);
============================================================
补充:
传进去的参数,在线程里再转换回来就可以了。 任何类型都可以传,没有局限于指针的限制。
ULong g_ulMainThreadId = (PtrToULong)lpVoid; //(ULong)lpVoid
不怕不能用,就怕想不到。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式