Как я могу закончить тему для Windows - PullRequest
0 голосов
/ 11 декабря 2011

Я играю в C, используя Threads для Windows, но в какой-то момент игры мне нужно остановить некоторые потоки в определенный момент, я не знаю ни функции, ни параметров, которые мне нужны, чтобы остановить поток, ни что это возвращается.

Эти две функции одинаковы, простой таймер, который запускается до достижения лимита счетчика. Я хочу останавливать второй поток всякий раз, когда захочу, без использования второго параметра WaitForSingleObject (hThread, Miliseconds).

DWORD WINAPI timer(LPVOID segundo)
{

    int counter = 0;
    while(counter<segundo)
    {
        counter++;
        gotoxy(30,5);
        printf("%d", counter);
        Sleep(1000);
    }
    return NULL;
}

DWORD WINAPI prueba(LPVOID segundo)
{
    int counter = 0;
    while(counter<segundo)
    {
        counter++;
        gotoxy(30,10);
        printf("%d", counter);
        Sleep(1000);
    }
    return NULL;
}

int main()
{
    int limit = 5, *ptr;
    *ptr = limit;
    HANDLE hThread1, hThread2;
    DWORD time, probo;
    hThread1 = CreateThread(NULL, 0, timer, *ptr, 0, &time);
    hThread2 = CreateThread(NULL, 0, prueba, *ptr, 0, &probo);
    WaitForSingleObject(hThread2, INFINITE);
    WaitForSingleObject(hThread1,INFINITE);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

В C обычно используют глобальные BOOL, bTerminated, которые изначально установлены в FALSE. Поток неоднократно проверяет свое значение, например, в вашей теме будет написана функция while(counter<segundo && !bTerminated). Любая другая часть кода, которая хочет остановить поток, должна установить bTerminated в TRUE, и необходимо дождаться остановки потока, вызвав WaitForSingleObject. Если у вас более одного потока, вы можете использовать такую ​​логическую переменную для каждого потока.

Это решение также является стандартным подходом в Delphi, но в этом случае переменная bTeridity является полем класса TThread и имеет значение true bay, вызывающее метод Terminate. Аналогичные реализации существуют и в C ++.

0 голосов
/ 12 декабря 2011

Создайте событие, используя функцию CreateEvent(NULL,FALSE,FALSE,NULL), передайте этот дескриптор события в поток, а затем в процедуре потока используйте WaitForSingleObject(hEvent,1000). Всякий раз, когда вы хотите остановить поток, вызовите SetEvent(hEvent), затем в proc потока выполните:

DWORD retval = WaitForSingleObject(hEvent,1000);
if( retval != WAIT_TIMEOUT )
    return 0;
...