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