2016-09-20 6 views
0

Я хочу запустить отдельный поток, чтобы закрыть программу, когда пользователь нажимает определенный ключ. Это структура моей программы.Запустите нить, чтобы закрыть программу, когда пользователь нажимает конкретный ключ

#include <iostream> 
#include <windows.h> 

using namespace std; 


DWORD WINAPI foo(LPVOID lpParameter) 
{ 
//do something 
return 0; 
} 

DWORD WINAPI boo(LPVOID lpParameter) 
{ 
//do something 
return 0; 
} 


int main(int argc, char **argv) 
{ 
    HANDLE foo1,boo1; 

    while(true) 
    { 
     foo1 = CreateThread(NULL,0,foo,NULL,0,NULL); 
     boo1= CreateThread(NULL,0,boo,NULL,0,NULL); 
     //do something 

    } 

    return 0; 
} 

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

Я понятия не имею, как это сделать. Может кто-нибудь мне помочь?

PS: Я должен сделать это, используя нити только :)

+0

Зачем использовать потоки для чего-то простого? Это похоже на массовое перенапряжение. –

+0

На самом деле меня попросили сделать это, используя потоки. Вот почему. – User9125

+0

При создании потоков вы должны проверить, что дескриптор, возвращаемый вызовом CreateThread, действителен, в противном случае вы можете получить исключение доступа к памяти. После того, как вы закончите с потоками, вы должны закрыть дескрипторы с помощью функции CloseHandle. –

ответ

0

Вы не создаете два потока. Вы создаете потоки в бесконечном цикле, пока не исчерпаете память. Кроме того, ваша основная функция уже работает в отдельном потоке, поэтому вы можете вводить туда свой пользовательский ввод. Например:

HANDLE hevent = NULL; 
bool done = false; 

DWORD WINAPI foo(LPVOID lpParameter) 
{ 

    while(!done) 
    { 
     ::WaitForSingleObject(hevent, -1); 
     printf("\rfoo"); 
     Sleep(1000); 
     ::ResetEvent(hevent); 
    } 
    return 0; 
} 

DWORD WINAPI boo(LPVOID lpParameter) 
{ 

    while(!done) 
    { 

     printf("\rboo"); 
     Sleep(1000); 
     SetEvent(hevent); 
    } 
    return 0; 
} 


int main(int argc, char **argv) 
{ 
    HANDLE foo1,boo1; 

    hevent = CreateEvent(NULL, TRUE, TRUE, NULL); 

    foo1 = CreateThread(NULL,0,foo,NULL,0,NULL); 
    boo1= CreateThread(NULL,0,boo,NULL,0,NULL); 
    HANDLE handles[] = {foo1, boo1}; 
    char c = getchar(); 
    done = true; 
    ::WaitForMultipleObjects(2, handles, TRUE, -1); 

    return 0; 
} 
+0

Большое спасибо за ваш ответ. Я вижу, что вы указываете, что не так с моим кодом. Но я использую файл заголовка windown.h, и когда я создаю поток, он начинает работать правильно? Пожалуйста, поправьте меня, если я ошибаюсь. И, пожалуйста, будьте любезны, чтобы рассказать мне, как я могу сделать точную вещь только с использованием двух потоков без создания бесконечных потоков. Ваша помощь очень ценится. – User9125

+0

Когда вы создаете поток с приведенными выше аргументами, он создается и входит в текущее состояние (при условии, что создание потока выполнено успешно). Функция CreateThread возвращается сразу после создания потока. Чтобы создать два потока, вы должны изменить свою основную функцию, как показано в ответе выше. Он создает два потока, а затем ждет ввода пользователя. После ввода он ждет выхода потоков, а затем возвращается. Это то, чего вы пытаетесь достичь? –

+0

На самом деле меня попросили разработать это, чтобы отображать две строки один за другим, пока пользователь не решит выйти. (например: отображение foo и boo как мигание. Когда foo показывает, строка boo должна исчезнуть и наоборот). Вот почему мне нужен бесконечный цикл while. А также это должно произойти, пока пользователь не нажмет конкретный ключ. Программа не может дождаться входа пользователя. Но когда пользователь нажимает клавишу, он должен выйти. В принципе, должен работать как прослушиватель действий, используя потоки. – User9125

Смежные вопросы