|
//mingw 3.02編譯通過
?1
#include?
<
stdio.h
>
?2
#include?
<
stdlib.h
>
?3
#include?
<
windows.h
>
?4
#include?
<
openssl
/
md5.h
>
?5
?6
typedef?
void
?
*
PVOID;
?7
typedef?
void
?
*
LPVOID;
?8
?9
10
DWORD?WINAPI?ThreadFunc(LPVOID);
11
12
int
?main()
{
13
??HANDLE?hThrd1;
14
??HANDLE?hThrd2;
15
??DWORD?exitCode1?
=
?
0
;??
16
??DWORD?exitCode2?
=
?
0
;
17
??DWORD?threadId;
18
19
20
??
/**/
/*
hThread?=?CreateThread?(&security_attributes,?dwStackSize,?ThreadProc,pParam,?dwFlags,?&idThread)?
21
???WINBASEAPI?HANDLE?WINAPI?CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,PVOID,DWORD,PDWORD);
22
?????第一個參數是指向SECURITY_ATTRIBUTES型態的結構的指針。在Windows?98中忽略該參數。在Windows?NT中,它被設為NULL。
23
??第二個參數是用于新線程的初始堆棧大小,默認值為0。在任何情況下,Windows根據需要動態延長堆棧的大小。
24
?????第三個參數是指向線程函數的指標。函數名稱沒有限制,但是必須以下列形式聲明:DWORD?WINAPI?ThreadProc?(PVOID?pParam)?;
25
?????第四個參數為傳遞給ThreadProc的參數。這樣主線程和從屬線程就可以共享數據。
26
?????第五個參數通常為0,但當建立的線程不馬上執行時為旗標
27
?????第六個參數是一個指針,指向接受執行緒ID值的變量
28
??
*/
29
??hThrd1?
=
?CreateThread(NULL,?
0
,?ThreadFunc,?(LPVOID)
1
,?
0
,?
&
threadId?);
//
建立第一個線程
30
??
if
?(hThrd1)
31
????printf(
"
Thread?1?執行\n
"
);
32
33
??hThrd2?
=
?CreateThread(NULL,?
0
,?ThreadFunc,?(LPVOID)
2
,?
0
,?
&
threadId?);
34
??
if
?(hThrd2)
35
????printf(
"
Thread?2?執行\n
"
);
36
37
??
//
?Keep?waiting?until?both?calls?to?GetExitCodeThread?succeed?AND
38
??
//
?neither?of?them?returns?STILL_ACTIVE.
39
??
for
?(;;)?
{
40
????printf(
"
按任意鍵退出..\n
"
);
41
????getchar();
42
????
//
WaitForSingleObject();
43
????GetExitCodeThread(hThrd1,?
&
exitCode1);
//
取得線程函數的返回值
44
????GetExitCodeThread(hThrd2,?
&
exitCode2);
45
????
if
?(?exitCode1?
==
?STILL_ACTIVE?)
46
??????puts(
"
Thread?1?正在執行狀態!
"
);
47
????
if
?(?exitCode2?
==
?STILL_ACTIVE?)
48
??????puts(
"
Thread?2?正在執行狀態!
"
);
49
50
????
if
?(?exitCode1?
!=
?STILL_ACTIVE?
&&
?exitCode2?
!=
?STILL_ACTIVE?)
51
?????
break
;
52
??}
53
54
??CloseHandle(hThrd1);
55
??CloseHandle(hThrd2);
56
57
??printf(
"
Thread?1?returned?%d\n
"
,?exitCode1);
58
??printf(
"
Thread?2?returned?%d\n
"
,?exitCode2);
59
??getchar();
60
??
return
?
0
;
//
EXIT_SUCCESS;
61
}
62
63
/**/
/*
64
*?Take?the?startup?value,?do?some?simple?math?on?it,
65
*?and?return?the?calculated?value.
66
*/
67
DWORD?WINAPI?ThreadFunc(LPVOID?n)
{
68
??Sleep((DWORD)n
*
1000
*
2
);
69
??printf(
"
Thread?%d?正在執行\n
"
,n);
70
??
return
?(DWORD)n?
*
?
10
;
71
}
72
|