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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建线程函数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指针过去就行了。

参考技术A 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;
自己的类的话 也是同样的转换
参考技术B VOID* 可以是任意的变量。。
可以传递一个结构体,也可以是类。。看你淫荡指数。。
请自己仔细看MSDN。孙鑫的VC++编程也讲过了。。
参考技术C 直接把主线程的值所在的窗体传过去就可以了。 参考技术D int i=1;
CreateThread(.., (LPVOID)i ,..);
在线程函数在把变量的类型转换回来应该就可以

015 _beginthreadex CreateThread 函数区别

_beginthreadex讲解
_beginthreadex
  ○ 纯 C/C++ API
    ○ 多线程这一块的运行库
  ○ C语言的错误处理机制 errno
    ○ 3条
    ○ 线程变得不安全了
  _beginthreadex();  //要比CreateThread 安全尽量使用_beginthreadex(); 创建线程
    //分配空间
    //调用CreateThread
  _endthreadex();

  CreateThread();
  EndThread();

以上是关于创建线程函数CreateThread的lpParameter参数怎么设置才能将在主线程中初始化的值传递给线程函数的主要内容,如果未能解决你的问题,请参考以下文章

使用CreateThread函数创建线程

VC++中通过CreateThread创建的线程,当线程入口函数执行完后,线程自己会关闭吗?

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

windows多线程 创建线程 CreateThread

CreateThread,_beginthread与AfxbeginThread之间的区别

在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)