Закрытие темы с помощью ExitThread - C - PullRequest
2 голосов
/ 19 марта 2010

У меня есть простая программа, которая создает поток, зацикливается двадцать раз, а затем выполняет вызов, чтобы закрыть себя и выполнить необходимую очистку.

Когда я отлаживаю программу, она достигает ExitThread (); метод и паузы, игнорируя printf (); Я установил после этого сигнал, что он закрыт.

Это нормально или я забыл что-то сделать? Я новичок в потоках с использованием C.

Main ()

void main()
{
    Time t;
    int i = 0;

    StartTimer();

    for(i = 0; i < 20; i++)
    {
        t = GetTime();
        printf("%d.%.3d\n", t.seconds, t.milliseconds);
        Sleep(100);
    }
    StopTimer();
}

Создание темы

void StartTimer()
{
    DWORD threadId;
seconds = 0;
milliseconds = 0;

// Create child thread
hThread = CreateThread(
    NULL,       // lpThreadAttributes (default)
    0,          // dwStackSize (default)
    ThreadFunc, // lpStartAddress
    NULL,       // lpParameter
    0,          // dwCreationFlags
    &threadId   // lpThreadId (returned by function)
    );

// Check child thread was created successfully
if(hThread == NULL)
{
    printf("Error creating thread\n");
}
}

Тема закрыта

void StopTimer()
{
    DWORD exitCode;

    if(GetExitCodeThread(hThread,&exitCode) != 0)
    {
        ExitThread(exitCode);   
        printf("Thread closed");

        if(CloseHandle(hThread))
        {
            printf("Handle closed");
        }
    }
}

Edit:

Я понял, что ExitThread () останавливает исполняющий поток, поэтому я попытался использовать другой метод, чтобы остановить таймер, но у меня все еще остается тот же результат.

void StopTimer()
{    
    WaitForSingleObject(hThread,INFINITE);
}

Решение:

Причина, по которой программа остановилась при вызове WaitForSingleObject () и не выполнялась, независимо от того, сколько времени это заняло, потому что операция, в которой она ожидала, имела бесконечный цикл.

Было бы ждать окончания бесконечного цикла, а это не лучшая вещь. Изменение задержки WaitForSingleObject () на более разумное значение, например, 100, позволило программе нормально работать.

Спасибо за ввод.

Ответы [ 5 ]

2 голосов
/ 19 марта 2010

Да, это «нормально», вызывая ExitThread, вы сообщаете окнам, что закончили с этим вызывающим потоком, поэтому остальная часть кода не будет вызываться. Это немного похоже на вызов exit (0).

Лично я бы не стал этим пользоваться. С остальным кодом все в порядке, вы правильно очищаете поток, просто выйдите из функции потока как обычно.

1 голос
/ 19 марта 2010

Поскольку вы вызываете StopTimer в контексте основного потока, когда он вызывает выходной поток, он завершает основной поток и вместе с ним завершает процесс.

1 голос
/ 19 марта 2010

Функция ExittThread прерывает поток CALLING - немедленно.

1 голос
/ 19 марта 2010

Это нормально, потому что ExitThread фактически выходит из текущего потока, поэтому он никогда не вернется и следующие инструкции никогда не будут выполнены.

Кстати, вы никогда не должны вызывать напрямую ExitThread (если вы действительно не знаете, что делаете): вам просто нужно вернуться из функции потока.

Тогда, если вы используете библиотеку времени выполнения C, вам не следует использовать API-интерфейс raw thread, но библиотека времени выполнения C работает как _beginthread и _beginthreadex.

0 голосов
/ 20 мая 2010

Вы можете создать событие в начале ThreadFunc, например, hStop, и ждать этого события в течение любого времени в каждом цикле. затем вы можете использовать SetEvent () в главном потоке, чтобы попросить его прекратить.

Примечание. Для исполняемого файла, связанного с LIBCMT.LIB, не вызывайте Win32 ExitThread API; это препятствует тому, чтобы система времени выполнения вернула выделенные ресурсы. _endthread and_endthreadex возвращает выделенные ресурсы потока и затем вызывает ExitThread.

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