在Web上的示例中,對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) ;