0

X分ごとに独立してタスクを実行する必要があるC++ DLLモジュールで作業しています。タスクのスレッドを作成しようとしましたが、スレッドを作成するメイン プログラムも、子スレッドが完了するまで待機し続けます。

メインプログラムから独立した別のプロセス(可能であればサンプルコードを提供してください)を作成してタスクを実行する方法を教えてください。プロセスは関数を取り、X 分ごとに関数に存在するコードを実行する必要があります。

編集

void test(void *param)
{
    cout << "In thread function" << endl;
    Sleep(1000); // sleep for 1 second
    cout << "Thread function ends" << endl;
    _endthread();
}

int main()
{
    HANDLE hThread;
    cout << "Starting thread" << endl;
    cout << (hThread = (HANDLE)_beginthread(test,0,NULL));
    WaitForSingleObject( hThread, INFINITE );
    cout << "Main ends" << endl;
    return 0;
}
4

1 に答える 1

0

WaitForSingleObject()スレッドが完了するまでメインをブロックします。スレッド関数から定期的に何かを実行したい場合はtest()、そこにループを配置する必要があります。終了時にスレッド関数の終了をトリガーするいくつかの条件が最適main()です。WaitForSingleObject()メソッドを終了する前に呼び出すべきではありませんmain()。したがって、test()メソッドは非同期で実行されます。

bool endThread = false;
void test(void *param)
{
    cout << "In thread function" << endl;
    while(!endThread)
    {
        Sleep(1000); // sleep for 1 second
    }

    cout << "Thread function ends" << endl;
    _endthread();
}

int main()
{
    HANDLE hThread;
    cout << "Starting thread" << endl;
    cout << (hThread = (HANDLE)_beginthread(test,0,NULL));

    // Do any other stuff without waiting for the thread to end
    // ...

    endThread = true;
    WaitForSingleObject( hThread, INFINITE );
    cout << "Main ends" << endl;
    return 0;
}

endThreadミューテックスなどを使用して変数へのアクセスを適切に同期する必要がある場合があることに注意してください。サンプルは原則を示すだけです。

アップデート:

スレッドが終了する前に終了したい場合はmain()、スレッドをまったく使用できません。

最初のコメントで述べたように、独立した子プロセスを作成する必要があります。fork()これを行うと関数を検索しexec()ます (これらにも特定の WinAPI メソッドがあるかもしれませんが、私は知りません)。

于 2012-10-25T14:37:15.363 に答える