在线程中渲染时窗口内容混乱

问题描述 投票:0回答:1

所以,当我像这样运行我的程序时,弹出的窗口很好,带有我之前附加的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 图像)

为什么踏板会弄乱我的窗口内容?

c++ multithreading c++11
1个回答
-1
投票

几乎没有任何 UI/窗口工具包旨在从任意线程内容调用。在所有情况下,您都应该从与事件循环相同的线程(不一定是主线程)调用 API。 Windows、MacOSX、iOS 和 Android 都是如此。从你的问题中不清楚你正在使用哪个。

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

当您违反此规则时,不同框架的行为方式不同,选项包括:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.