创建线程函数CreateThread的lpParameter参数怎么设置才能将在主线程中初始化的值传递给线程函数

如题所述

可以传递一个参数给线程函数,线程函数是这么个形式
DWORD WINAPI MyThreadProc(LPVOID lpParameter)
你在CreateThread给他的这个参数就是传递到了线程函数。这个参数完全是编程的人自己决定的,可以直接给NULL,比较常见的是你建立一个结构体,把你希望传递进去的信息都写在结构体里面
typedef struct
{
int paraInt;
DWORD paraDW;
....
} ThreadParameter;

然后在CreateThread:
ThreadParameter para;
//设置参数省略
CreateThread(NULL, NULL,
MyThreadProc, reinterpret_cast<ThreadParameter*>(& para),
NULL, NULL);追问

呵呵,我就是想问的这个,有多个数据公用不知道能用结构体,主线程和辅线程需要用到共同的对象,那对象定义是不是要在这个结构体里?

追答

结构体可以定义任何的东西,但是在结构体里面定义对象还是定义指针你要根据自己的情况来看,一般定义指针比较多,比如你在主线程里面先操作一个对象,初始化啊什么的,然后将指针传递给工作线程进行后台时间比较长的工作。如果你只要一个参数那直接把对象指针传递过去就行了。

只是你要注意的是这个传递过去的lpParameter指针所指向的对象不能是局部变量,否则主线程的函数返回之后结构体对象就被删除了,这时候工作线程中的指针就变成了无效的指针,对无效指针的访问会导致Access Violation错误,默认Windows会弹个错误将程序强行结束。

如果你不想声明全局变量也不想为主线程所在的类(假定你是面向对象的编程)添加成员变量,可以用new在堆上创建一个对象,这样主线程函数返回的时候堆上的对象是不会删除的。只是你要记得在工作线程退出的时候要用delete把这个lpParameter给删除,否则就导致内存泄漏,内存泄漏少你不会察觉,泄漏多了你的程序的内存占用就会很厉害。

还有个比较偷懒的方法就是直接传this指针过去就行了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-11-19
LPVOID lpParameter, 说明这个参数是个空指针类型, 简单的说,你想传任何东西都可以,强制转换就OK了.
例如 int i = 10; 你想传这个进去的话参数 就写 (void*)&i , 到了函数里面再强制转换回来 int iTemp = *((int*)lpParameter) 或者直接用指针 int* ipTemp = (int*) lpParameter;
例如 float f = 10.0; 你想传这个进去的话 就写 (void*)&f , 到了函数里面再强制转换回来 float fTemp = *((float*)lpParameter) 或者直接用指针 float* ipTemp = (int*) lpParameter;
自己的类的话 也是同样的转换本回答被网友采纳
第2个回答  2011-03-13
VOID* 可以是任意的变量。。
可以传递一个结构体,也可以是类。。看你淫荡指数。。
请自己仔细看MSDN。孙鑫的VC++编程也讲过了。。
第3个回答  2011-03-14
直接把主线程的值所在的窗体传过去就可以了。
第4个回答  2011-03-13
int i=1;
CreateThread(.., (LPVOID)i ,..);
在线程函数在把变量的类型转换回来应该就可以