0

スレッドセーフなコールバックに問題があります。

void draw_something() { /* draws something */ }

draw_something問題は、他のコードに関係なく、指定した時間ごとにメイン アプリケーション スレッドを呼び出す方法です (したがって、C# タイマーのように動作し、メイン スレッドで関数を起動します)。以前、CreateWindow を使用して、(メイン スレッドで) SendMessage (別のタイマー スレッドから送信された) からのメッセージを処理する補助ウィンドウを作成していました。

void MainThreadFunction(){
    CreateThread(0, NULL, GoProc, NULL, NULL, NULL);
}

DWORD WINAPI GoProc(LPVOID lpParam){
    while(1){
        SendMessage(auxiliary_window_hWnd, ADDINATIONAL_MESSAGE, 0, 0);
        Sleep(30);
    }
    return 0;
}

したがって、ウィンドウの MessageQueue はセーフスレッド呼び出しを処理しますが、それが非常に効率的でエレガントな方法であるかどうかはわかりません。より良い方法があることは知っていますが(おそらくブースト?)、わかりません。

4

2 に答える 2

5

WindowsSetTimer呼び出しを使用して定期的なWM_TIMERメッセージを取得し、2 番目のスレッドを完全にスキップできます。

于 2012-04-13T22:21:41.427 に答える
0

とにかく、ユーザー空間ではなく、実行中のスレッドを魔法のように「中断」して独自のコードを「注入」することはできません。

特に厳密な一時的な要件がない場合は、基本的にメッセージパッシングの形式である既に持っているソリューションで問題ありません。

時間重要な場合、つまり、イベント (あなたの場合は時間の経過) とそのイベントの処理の間の特定の待ち時間を保証する必要がある場合は、イベントを「検出」したスレッドで処理を行うか、イベントを維持する必要があります。ワーカ スレッドのプールはすぐに起動して処理を実行できます。draw_something()しかし、UIスレッドで行う必要があると推測しているため、この解決策はおそらく出ていません。

于 2012-04-13T22:54:58.597 に答える