В примерах в Интернете вызовы CreateThread обычно передают указатель на структуру для LPVOID lpParameter
, и вы используете этот указатель для доступа к самой структуре.
#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" ) ;
}
Я считаю, что это несколько неудобно, так как вы должны убедиться, что структура существует, и убедиться, что она должным образом уничтожена после завершения выполнения потока.
Я хотел бы запустить свой поток, но передав обычные аргументы стека , то есть автоматические переменные или, возможно, сам struct
в процедуру запуска потока:
DWORD threadStartPointFuncStyleIWant( Data d ) ;
Так что мои вопросы на самом деле:
- Для начальной точки потока (CreateThread) мы ограничены функцией с прототипом вида:
DWORD validThreadFunc( LPVOID pParamStruct ) ;
- Или мы можем запустить поток для таких функций, как
DWORD threadFunc1( int p1, int p2 ) ;
DWORD threadFunc2( Data d ) ;