0

そのため、私はWindows APIのスレッドについて学び、いくつかのテストコードを作成しましたが、いくつかの問題があります。まず、2つの機能があります。

DWORD WINAPI MyThreadFunction( LPVOID lpParam ) 
{
    int i = (int)lpParam;
    cout << i << ".) I work! " << endl;
    return 0;
}

// MyThreadFunction2 - loops continuously forever, outputing "working..." every 1ms
DWORD WINAPI MyThreadFunction2( LPVOID lpParam ) 
{
        int i = (int)lpParam;
    while(1) {
        cout << i << ".) Working... " << endl;
        Sleep(1);
    }
    return 0;
}

そして、私はCreateThreadを使用してスレッドを作成していますが、後でそれを_beginThreadに変更します。これは、別の関連する投稿で人々が私に行うように指示したものです。だからこれは私がスレッドを作成している方法です:

    threads.push_back(CreateThread(
                                   NULL,           // default security attributes
                                   0,              // use default stack size
                                   lpStartAddress, // thread function name
                                   lpParameter,    // arugument to thread function
                                   0,              // use default creation flag
                                   NULL));         // ignore thread identifier.

作成したスレッドハンドルをベクトルに入れていますが、それは関係ありません。基本的に私は上記のコードを動作させており、スレッドを正常に作成します。私が抱えている問題は、スレッドがMyThreadFunction2を使用して作成されたときに、TerminateThread(HANDLE、0)を呼び出すことです。この場合、スレッドは永久にループします。TerminateThreadを呼び出すと、プログラムがフリーズしてそこに留まります。「Working...」メッセージが表示されないため、スレッドが停止したようですが、他のコードは続行されません。ただし、MyThreadFunctionを使用しているときにこれと同じ関数を呼び出すと、正常に機能します。

これが私が何が起こっているのかを説明する方法を非常に混乱させているかどうかはわかりませんが、そうではないことを願っています。これは「コードをダンプして、人々に修正してもらう」場所ではないことを私は知っています-私は他の誰かの投稿でそれを読みましたが、あなたが私が上に書いたことを理解しなかった場合、またはそれが役立つ場合に備えて、ここにあります私のコード:

ThreadManager.cpp

http://pastebin.com/0B1N3TAH

ThreadManager.h

http://pastebin.com/yfwMJTaz

申し訳ありませんが、コードの記述が不十分で、いくつかのことが完了していません。私はまだC++の再学習と、WindowsAPIの使用方法の学習に取り組んでいます。しかし、誰かが私が間違っている可能性があることについて何か考えを持っていますか?

4

1 に答える 1

4

TerminateThreadを使用してスレッドを強制終了することは、一般的に非常に悪い考えです。この関数のMSDNページでさえ、それを教えてくれます。スレッドに動作を停止するように指示するより良い方法は、スレッドにイベントを渡すことです。イベントを使用すると、無限ループを実行するスレッドが。while (WaitForSingleObject(event, 1) == WAIT_TIMEOUT)の代わりに実行しwhile (1)ます。

なぜTerminateThreadが死ぬのかを正確に実行するのか、私にはわかりませんが、このhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms686717を読むと、何が間違っているのかを知ることができます。 (v = vs.85).aspx

于 2013-01-12T05:37:34.007 に答える