0

Visual C ++ 2010に、いくつかの円と線を描画する必要があるプロジェクトがあります。円の座標は、2つのグローバル変数に依存します。グローバル変数は、それぞれが独自のスレッドで実行される2つの関数から変更されます。ブーストはマルチスレッドに使用されます。ただし、スレッドを実行するとすぐにメインスレッドがブロックされるため、図形を描画したり、グローバル変数を使用したりできなくなります。どうすればこれを回避できますか?私が最終的に達成したいのは、独自のスレッドで実行されている2つの別個の関数からグローバル変数を変更し、前述のグローバル変数を使用して同時に円を描くことです。

global_variable_1
global_variable_2

void function_1()
{
    while(true)
    {
    //modifies global_variable_1
    }
}

void function_2()
{
    while(true)
    {
    //modifies global_variable_2
    }
}

void MyOnPaint(HDC hdc)
{
    Graphics graphics(hdc);
    Pen pen(Color::Blue);

    /* Uses global_variable_1 & global_variable_2 to
    draw circles */
}

int APIENTRY _tWinMain(......)
{
    /* Some initial code */

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GAZEPOINTEVALUATION));

    /*Start threads*/
    using namespace boost;

    thread thread_1(function_1);

    thread thread_2(function_2);

    //Start threads
    thread_1.join()
    thread_2.join()

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
        case WM_COMMAND:
            /* Some code */
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            /*CALL MY DRAWING METHOD*/
            MyOnPaint(hdc);   
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            /* Some code */
        default:
            /* Some code */
    }
    return 0;
}
4

1 に答える 1

2

joinスレッドが永遠にループするため、呼び出しは返されません。ドキュメントから:

実行スレッドが終了するのを待つには、boost :: threadオブジェクトのjoin()、__ join_for、または__join_until(timed_join()は非推奨)メンバー関数を使用する必要があります。join()は、boost :: threadオブジェクトで表されるスレッドが完了するまで、呼び出し元のスレッドをブロックします。

したがって、メッセージループに入ることはありません。

参加呼び出しを削除すると、これは期待どおりの動作をするはずです。より複雑なアプリケーションでは、スレッドのスケジューリングと終了処理を適切に設計する必要があります。現状でも、CPUをペギングしたり、予期しない他の奇妙な状況が発生したりしないように、生成されたスレッドに遅延を追加する必要があります。

于 2013-03-11T15:16:06.387 に答える