2016-09-20 5 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; 
} 

プログラムを実行している間は、常にループ中に2つのスレッドを作成しています。だから私は別のスレッドを追加して、ユーザーがプログラムを実行している間にキーを押すたびに、ユーザーがプログラムを閉じるのに合った特定の文字と比較した後にユーザー入力を取得したい。

私はそれを行うことは考えていません。誰かが私を助けることができますか?

PS:私は使用してスレッドが唯一:)

+0

なぜこのような単純なものにスレッドを使用するのですか?それは大規模な過度の複雑化のようです。 –

+0

実際にスレッドを使ってそれを行うように求められました。それが理由です。 – User9125

+0

スレッドを作成するときは、CreateThread呼び出しによって返されたハンドルが有効であることを確認する必要があります。そうでない場合は、メモリアクセス例外が発生します。スレッドを終了したら、CloseHandle関数でハンドルを閉じる必要があります。 –

答えて

0

次の2つのスレッドを作成していないことをしなければなりません。メモリが足りなくなるまで、スレッドを無限ループで作成しています。また、メインは既に別のスレッドで実行されているため、そこにユーザー入力を行うことができます。例:

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ヘッダーファイルを使用しています。スレッドを作成すると、正しく実行されますか?私が間違っているなら、私を修正してください。無限のスレッドを作成せずに2つのスレッドだけを使って正確なことをするにはどうすればいいのか教えてください。あなたの助けが大変ありがとうございます。 – User9125

+0

上記の引数を使用してスレッドを作成すると、スレッドが作成され、実行状態になります(スレッドの作成が成功したと仮定します)。 CreateThread関数は、スレッドの作成直後に戻ります。 2つのスレッドを作成するには、上の答えに示すように主関数を変更する必要があります。 2つのスレッドを作成し、ユーザーの入力を待ちます。入力後、スレッドが終了するのを待ってから戻ります。これはあなたが達成しようとしていることですか? –

+0

実際に私は、ユーザーが終了することを決定するまで、2つの文字列を次々に表示するようにこれを開発するように求められました。 (例:fooとbooを点滅させるように表示すると、fooがBoo文字列を表示すると、その文字列が消えるようになります)そういうわけで私は無限ループが必要でした。また、ユーザーが特定のキーを押すまでこれが行われます。プログラムはユーザーが入力するまで待機できません。しかし、ユーザがキーを押すと、それは終了するはずです。基本的にスレッドを使ったアクションリスナのように動作するはずです。 – User9125

関連する問題