第一篇,第二章 之 GetExitCodeThread()

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,编译,运行.

GetExitCodeThreadWindows API中用于获取线程退出代码的函数。当一个线程执行完毕后,它会有一个退出代码,这个代码可以告诉我们线程是正常结束还是因为某种错误而退出,或者以其他方式结束。 GetExitCodeThread函数的主要用途是允许一个线程查询另一个线程的退出状态。如果线程还没有结束,那么你可以获取一个特殊的状态值,表示线程仍在运行;如果线程已经结束,你可以获取到线程的退出代码,这个代码通常是由线程在其结束时设置的。 使用GetExitCodeThread的基本步骤如下: 1. 首先,你需要获取线程的句柄,这通常在创建线程时通过函数(如CreateThread)返回。 2. 然后,调用GetExitCodeThread函数,并将线程句柄作为参数传入。 3. 函数会填充一个变量,这个变量接收线程的退出代码,你可以通过检查这个变量的值来确定线程是如何结束的。 下面是一个简单的示例代码段,展示如何使用GetExitCodeThread: ```cpp #include <windows.h> #include <stdio.h> DWORD WINAPI ThreadFunction(LPVOID lpParam) { // 线程函数内容 return 0; // 返回线程的退出代码 } int main() { HANDLE hThread = CreateThread( NULL, // 默认安全属性 0, // 默认堆栈大小 ThreadFunction, // 线程函数 NULL, // 线程函数参数 0, // 默认创建标志 NULL); // 默认线程ID // 等待线程结束 WaitForSingleObject(hThread, INFINITE); DWORD dwExitCode; if (GetExitCodeThread(hThread, &dwExitCode)) { if (dwExitCode == STILL_ACTIVE) { printf("线程仍在运行。\n"); } else { printf("线程退出代码:%u\n", dwExitCode); } } else { printf("获取线程退出代码失败。\n"); } CloseHandle(hThread); // 关闭线程句柄 return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值