创建线程函数CreateThread的lpParameter参数怎么设置才能将在主线程中初始化的值传递给线程函数
5个回答
展开全部
可以传递一个参数给线程函数,线程函数是这么个形式
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);
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指针过去就行了。
展开全部
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;
自己的类的话 也是同样的转换
例如 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;
自己的类的话 也是同样的转换
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
VOID* 可以是任意的变量。。
可以传递一个结构体,也可以是类。。看你淫荡指数。。
请自己仔细看MSDN。孙鑫的VC++编程也讲过了。。
可以传递一个结构体,也可以是类。。看你淫荡指数。。
请自己仔细看MSDN。孙鑫的VC++编程也讲过了。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接把主线程的值所在的窗体传过去就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int i=1;
CreateThread(.., (LPVOID)i ,..);
在线程函数在把变量的类型转换回来应该就可以
CreateThread(.., (LPVOID)i ,..);
在线程函数在把变量的类型转换回来应该就可以
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询