Почему GetExitCodeThread () возвращает FALSE здесь? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть небольшой тестовый код.Мое предположение в приведенном ниже коде, так как я не установил флаг, чтобы остановить поток, а затем в строке GetExitCodeThread().он должен вернуть TRUE, а код возврата - STILL_ACTIVE.В реальном тестировании результат таков: Каждый раз возвращаемое значение GetExitCodeThread() равно FALSE, поэтому в main() цикл while никогда не вводится.Может ли кто-нибудь сказать мне причину?Что не так в моем коде.Спасибо.

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "afxwin.h"

bool bExit = false;
HANDLE hOriginalThread;

static UINT ThreadFunc(LPVOID pParam)
{
    int iCount = 0;
    printf("start thread--ThreadFunc\n");
    printf("Thread loop start: --ThreadFunc");
    while (!bExit)
    {
        iCount++;
        if (iCount % 50 == 0)
            printf(".");
    }
    printf("Thread loop end: %d--ThreadFunc\n", iCount++);
    printf("end thread--ThreadFunc\n");
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    hOriginalThread = AfxBeginThread(ThreadFunc, (LPVOID)0, THREAD_PRIORITY_NORMAL, 0, 0);
    Sleep(500);
    DWORD dwEC;
    int iTry = 0;
    BOOL bStatus;
    bStatus = GetExitCodeThread(hOriginalThread, &dwEC);
    if (!bStatus)
    {
        printf("error GetExitCodeThread: %d--Main\n", GetLastError());
    }
    while (bStatus && dwEC == STILL_ACTIVE)
    {
        printf("Check Thread in active: %d--Main\n", iTry);
        Sleep(1);
        iTry++;
        if (iTry>5)
        {
            printf("Try to terminate Thread loop: %d--Main\n", iTry++);
            TerminateThread(hOriginalThread, 0);// Force thread exit
        }
        bStatus = GetExitCodeThread(hOriginalThread, &dwEC);
    }
    hThread = NULL;
    printf("End Main --Main\n");
    return 0;
}

1 Ответ

5 голосов
/ 20 сентября 2019

AfxBeginThread() возвращает указатель объекта CWinThread*, а не Win32 HANDLE, как CreateThread().Таким образом, GetExitCodeThread() завершается неудачно из-за неверного дескриптора потока, о котором GetLastError() должен был сказать вам.

CWinThread имеет operator HANDLE(), чтобы получить правильный дескриптор Win32 потокаНапример:

CWinThread *pThread = AfxBeginThread(...);
if (!pThread) ... // error handling
hOriginalThread = *pThread;

Причина, по которой ваш код даже компилируется, заключается в том, что вы, вероятно, не компилируете с включенной проверкой типа STRICT , поэтому HANDLE - это просто void*, что любой тип указателя может быть назначен.Если вы включите STRICT, HANDLE не будет void*, а присвоение возвращаемого значения AfxBeginThread() непосредственно hOriginalThread приведет к ошибке компилятора из-за несовместимости типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...