0

我在 Visual C++ 2010 中有一个项目,我必须在其中绘制一些圆圈和线条。圆的坐标取决于两个全局变量。全局变量由两个函数修改,每个函数都在自己的线程中运行。Boost用于多线程。但是,一旦我运行线程,我的主线程就会被阻塞,从而阻止我绘制形状和使用全局变量。我怎样才能解决这个问题?我最终想要实现的是,从在自己的线程中运行的两个独立函数修改全局变量,并使用所述全局变量同时绘制圆圈

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 回答