所以,当我像这样运行我的程序时,弹出的窗口很好,我之前附上了一个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图像)
为什么踏板弄乱了我的窗户内容?
答案 0 :(得分:0)
几乎没有任何UI / Windowing工具包可以从任意线程内容中调用。在所有情况下,您都应该从与事件循环相同的线程调用API(不一定是主线程)。这适用于Windows,MacOSX,iOS和Android。您的问题并不清楚您使用的是什么。
这是明智的设计选择,因为如果工具包使用互斥锁防止竞争条件,编写导致死锁或优先级倒置的代码将非常容易。
违反此规则时变化框架的行为方式各不相同,包括:
上面代码的要点是你想在后台线程上执行昂贵的渲染操作。通常这样做的方法是双缓冲:渲染到后台线程中的位图,然后将位图渲染到UI线程上的窗口 - 这通常是一个廉价的操作。