bob*_*obo 1 c++ windows multithreading
在Web上的示例中,对CreateThread的调用通常会传递指向struct的指针LPVOID lpParameter,并使用该指针来访问struct本身.
#include <Windows.h>
#include <stdio.h>
struct Point
{
float x,y,z ;
} ;
DWORD WINAPI threadStartPoint( LPVOID data )
{
Sleep( 1000 ) ;
Point *p = (Point*)data ;
printf( "%f %f %f\n", p->x, p->y, p->z ) ;
puts( "Thread job done" ) ;
return 0 ;
}
// From main
int main()
{
DWORD threadId ;
Point p ;
p.x=2, p.y=3, p.z=4 ;
HANDLE handle = CreateThread( 0, 0,
threadStartPoint,
(LPVOID)&p,
0, // ?? I think I should be using this parameter</b>
&threadId
) ;
if( !handle )
{
// Thread creation failed
puts( "start fail\n" );
}
else
{
printf( "started on threadid=%d\n", threadId ) ;
}
WaitForSingleObject( handle, 2000 ) ; // wait up to 2000 ms for the other thread to complete before moving on
puts( "main thread Exiting.." ) ;
//system( "pause" ) ;
}
Run Code Online (Sandbox Code Playgroud)
我发现这有点不方便,因为你必须确保struct存在,并确保在线程完成执行时正确销毁它.
我想开始我的线程,但是传递正常的堆栈参数,即自动变量,或者可能将struct自身传递给线程启动例程:
DWORD threadStartPointFuncStyleIWant( Data d ) ;
所以我的问题是:
DWORD validThreadFunc( LPVOID pParamStruct ) ;
DWORD threadFunc1( int p1, int p2 ) ; DWORD threadFunc2( Data d ) ;
CreateThread只接受一种类型的函数,即接受单个LPVOID参数的函数.没有办法与kernel32.dll通信,它是调用你的线程函数的代码,它应该用任何其他参数列表调用它.内核总是以相同的方式调用函数.
你只需要像其他人一样继续这样做.在堆上分配结构,将指针传递给线程例程,然后在从线程例程返回之前释放它.也就是说,所有权从原始线程传递到新线程.一旦新线程获得所有权,您可以使用智能指针shared_ptr,以确保它在您离开线程时被释放.
您可以在该结构中传递另一个函数指针,或者使用自己的方法传递一个对象.然后你的线程程序只不过是解压缩LPVOID参数并调度到另一个函数指针或方法的东西,你可以在那里完成线程的所有实际工作.
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |