VC++ 如何创建一个线程并传递参数

在C++类里面创建线程,如何传别的参数进去?~

貌似在线程中并不能直接调用类里面的参数,即使调用了也只是类中函数的形式,并无内容。一般参数想在线程中被调用,就要new一个公用的内存空间供线程调用。以工作线程为例:
线程函数首先在类中声明
_beginthreadex( NULL, 0, yourfunc, this, 0, 0 );
(this指向类本身,比如是C**Dlg类)

线程函数UINT C**Dlg::yourfunc(void * pParam)中,pParam就为C**Dlg指针
通过强制转换提取:C**Dlg *p = (C**Dlg*)pParam;中的p就得到对应指针
之后通过p->就可以直接调用C**Dlg类中所使用的所有参数和函数(当然需要使用的参数必须在类中new过并赋值之后才能使用,参数使用完毕之后别忘了delete来释放开辟的内存)

用结构体指针 先定义一个结构体 包含你要传递的参数 再把这个结构体的地址强制类型转换后传给CreateThread函数 比如我的程序里的这句话:CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Process,&SockRec,0,NULL);

近来做个项目需要写点程序,比较烦.net写的老是需要背着.net包走,所以准备用VC++来写,其中用到了线程方面的知识这里记录下来以备后用。 创建一个工作线程十分简单,只需要两步你的线程就能跑了:(1)实现线程函数和(2)开始线程。不需要由CWinThread派生类,你可以不加修改地使用CWinThread。下面我们来看看如何开始一个线程。 AfxBeginThread有两种形式,一种是用来创建用户界面线程的,另一种就是用来创建工作线程的。为了开始执行你的线程,只需要向AfxBeginThread提供下面的参数就可以了: 线程函数的地址 传送到线程函数的参数 (可选的)线程的优先级,默认的是平常的优先级,如果希望使用其它优先级请参阅::SetThreadPriority (可选的)线程的堆栈大小,默认的大小是和创建线程的堆栈一样大 (可选的)如果用户创建的线程在开始的时候在挂起态,而不在运行态,可以设置为CREATE_SUSPENDED (可选的)线程的安全属性,默认的是和父线程的访问权限一样,有关安全信息的格式,请参阅SECURITY_ATTRIBUTES AfxBeginThread为用户创建并初始化一个CWinThread对象,运行这个对象,并返回它的地址,这样通过这个地址用户就可以找到它了。在这一过程中还要进行许多检查。这一切都不用你操心。那么下面我们来看看线程函数怎么写。线程函数定义了线程要做什么,在进入这个函数的时候线程开始,退出的时候线程结束。这个函数必须是下面的形式: UINT MyControllingFunction( LPVOID pParam ); 参数是一个32位数,这个参数在线程对象创建时传送给对象的构造函数。至于线程函数要怎么处理这个数,那就随便了,它可能是一个人的年纪,可能是一个文件的地址,可能是一个窗口句柄,反正你想它是什么就是什么,主动权在你手里。如果参数指的是一个结构,结束可以用来向线程传送参数,也可以让线程把结果传回主程序,线程需要通知主程序,什么时候来取结果。 在线程函数结束时,应该返回一个UINT类型的值,说明返回原因,也就是返回代码。通常这个数为0,表示正常返回,当然你也可以定义一个错误编码指示错误了。至于什么数代表什么,全在你。下面是一个线程函数的例子,这个例子解释如何定义线程函数,也介绍了如何从程序的其它地方控制线程:(为了了解线程的全部,请安心阅读其它文章) UINT MyThreadProc( LPVOID pParam ){CMyObject* pObject = (CMyObject*)pParam; if (pObject == NULL ||!pObject->IsKindOf(RUNTIME_CLASS(CMyObject))) return -1; // illegal parameter // do something with 'pObject' return 0; // thread completed successfully} // inside a different function in the program AfxBeginThread(MyThreadProc, pNewObject); 上面的例子是MSDN上写的,下面我还写个简单的,主函数传递参数给线程函数,并且线程函数返回值。主函数:void CNEWDLG::CreateNewThread() { CString s="hello"; AfxBeginThead(WorkThread,&s);//这里的参数&s完全可以改成你需要的其他类型的地址,实现你的操作。 Sleep(1000); MessageBox(s,NULL,0);}线程函数:UINT WorkThread(LPVOID pParam) //偶觉得关键是这个参数,它可以传递任何类型。{ CString* s1=(CString*)pParam; //不管你传递的是什么类型,都可以通过这种方式转换后使用。

相关兴趣推荐

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网