在线程中呈现时弄乱了窗口内容

时间:2017-07-19 11:13:46

标签: multithreading c++11

所以,当我像这样运行我的程序时,弹出的窗口很好,我之前附上了一个PNG图像:

void Render(Window* w){
    w->render();
}


int main(int argc, char** args){
        <...>
        Render(stock->getWindow(0));
        while(1);
}

但是当我像这样运行时:

int main(int argc, char** args){
        <...>
        std::thread m(Render,stock->getWindow(0));
        m.join();
        while(1);
}

窗口弹出,但没有我附加的PNG图像。相反,窗口包含窗口后面的背景(因此它显示了实际位于窗口后面的应用程序,而不是我附加的PNG图像)

为什么踏板弄乱了我的窗户内容?

1 个答案:

答案 0 :(得分:0)

几乎没有任何UI / Windowing工具包可以从任意线程内容中调用。在所有情况下,您都应该从与事件循环相同的线程调用API(不一定是主线程)。这适用于Windows,MacOSX,iOS和Android。您的问题并不清楚您使用的是什么。

这是明智的设计选择,因为如果工具包使用互斥锁防止竞争条件,编写导致死锁或优先级倒置的代码将非常容易。

违反此规则时变化框架的行为方式各不相同,包括:

  • 没有什么
  • 断言
  • 抛出异常
  • 不要试图阻止您并表现出非确定性行为

上面代码的要点是你想在后台线程上执行昂贵的渲染操作。通常这样做的方法是双缓冲:渲染到后台线程中的位图,然后将位图渲染到UI线程上的窗口 - 这通常是一个廉价的操作。