您的位置:首页 > 其它

第一篇,第二章 之 GetExitCodeThread()

2009-05-29 09:58 363 查看
BOOL GetExitCodeThread (

HANDLE hThread, // in,线程handle,也就是CreateThread()的返回值

LPDWORD lpExitCode //out,存储线程结束代码,也就是线程的返回值

);

说明: 此函数调用成功返回TRUE,失败返回FALSE,只表示这个函数是否调用成功而己.

不能根据返回值来判断一个线程是否结束,而要根据 lpExitCode的值来确定,

lpExitCode 值STILL_ACTIVE 表示线程正在运行.

若线程己经结束,则lpExitCode中存储指定线程的返回值.

例:

/*

* ExitCode.c

*

* Sample code for "Multithreading Applications in Win32"

* This is from Chapter 2, Listing 2-2

*

* Start two threads and try to exit

* when the user presses a key.

*/

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

#include <conio.h>

DWORD WINAPI ThreadFunc(LPVOID);

int main()

{

HANDLE hThrd1;

HANDLE hThrd2;

DWORD exitCode1 = 0;

DWORD exitCode2 = 0;

DWORD threadId;

//创建成功,返回一个HANDLE,对于此线程的操作函数,几乎都使用此HANDLE

hThrd1 = CreateThread(NULL,

0, //堆栈大小,0取默认值1MB

ThreadFunc, //线程函数地址

(LPVOID)1, //线程的传入参数

0, //0 表示线程一旦创建 立即执行

&threadId ); //线程ID,一般为 向线程发送消息时用,

if (hThrd1)

printf("Thread 1 launched/n");

//

hThrd2 = CreateThread(NULL,

0,

ThreadFunc,

(LPVOID)2,

0,

&threadId );

if (hThrd2)

printf("Thread 2 launched/n");

// Keep waiting until both calls to

// GetExitCodeThread succeed AND

// neither of them returns STILL_ACTIVE.

// This method is not optimal - we'll

// see the correct way in Chapter 3.

for (;;)

{

printf("Press any key to exit../n");

getch(); // 按任意键继续

// 刺探 指定线程(通过线程的HANDLE) 是否己经结束,

//exitCode1中存储线程状态,若正在运行,值为STILL_ACTIVE

//若己经结束,值为 线程的返回值(即 return 后的值)

GetExitCodeThread(hThrd1, &exitCode1);

GetExitCodeThread(hThrd2, &exitCode2);

if ( exitCode1 == STILL_ACTIVE )

puts("Thread 1 is still running!");

if ( exitCode2 == STILL_ACTIVE )

puts("Thread 2 is still running!");

if ( exitCode1 != STILL_ACTIVE

&& exitCode2 != STILL_ACTIVE )

break;

}

CloseHandle(hThrd1); //线程核心对象的引用计数 减1

CloseHandle(hThrd2);

printf("Thread 1 returned %d/n", exitCode1);

printf("Thread 2 returned %d/n", exitCode2);

return EXIT_SUCCESS;

}

/*

* Take the startup value, do some simple math on it,

* and return the calculated value.

*/

DWORD WINAPI ThreadFunc(LPVOID n)

{

Sleep((DWORD)n*1000*2);

return (DWORD)n * 10;

}

//以上代码,存储进text文件,以.c为扩展名,拖进VC 6.0,编译,运行.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: