Multithreading 在线程中渲染时,窗口内容混乱
因此,当我像这样运行我的程序时,弹出的窗口很好,带有我之前附加的PNG图像:Multithreading 在线程中渲染时,窗口内容混乱,multithreading,c++11,Multithreading,C++11,因此,当我像这样运行我的程序时,弹出的窗口很好,带有我之前附加的PNG图像: void Render(Window* w){ w->render(); } int main(int argc, char** args){ <...> Render(stock->getWindow(0)); while(1); } void渲染(窗口*w){ w->render(); } int main(int argc,ch
void Render(Window* w){
w->render();
}
int main(int argc, char** args){
<...>
Render(stock->getWindow(0));
while(1);
}
void渲染(窗口*w){
w->render();
}
int main(int argc,char**args){
渲染(股票->获取窗口(0));
而(1),;
}
但当我这样运行它时:
int main(int argc, char** args){
<...>
std::thread m(Render,stock->getWindow(0));
m.join();
while(1);
}
intmain(intargc,char**args){
线程m(渲染,库存->获取窗口(0));
m、 join();
而(1),;
}
窗口弹出,但没有我附加的PNG图像。相反,窗口包含窗口后面的背景(因此它显示的是实际位于窗口后面的应用程序,而不是我附加的PNG图像)
为什么踏板会弄乱我的窗口内容?几乎没有一个UI/窗口工具包是打算从任意线程内容调用的。在所有情况下,您都需要从与事件循环相同的线程(不一定是主线程)调用API。Windows、MacOSX、iOS和Android都是如此。你的问题不清楚你在用什么 这是一个明智的设计选择,因为如果工具包使用互斥锁来保护不受竞争条件的影响,那么编写导致死锁或优先级反转的代码将非常容易 当您违反此规则时,可变框架的行为方式不同选项包括:
- 没什么
- 断言
- 抛出异常
- 不要试图阻止你,不要表现出不确定的行为
上面代码的要点是,您希望在后台线程上执行昂贵的渲染操作。通常的做法是将缓冲区加倍:在后台线程中渲染为位图,然后在UI线程上的窗口中渲染位图,这通常是一种廉价的操作 几乎没有任何UI/Windowing toolkit是打算从任意线程内容调用的。在所有情况下,您都需要从与事件循环相同的线程(不一定是主线程)调用API。Windows、MacOSX、iOS和Android都是如此。你的问题不清楚你在用什么 这是一个明智的设计选择,因为如果工具包使用互斥锁来保护不受竞争条件的影响,那么编写导致死锁或优先级反转的代码将非常容易 当您违反此规则时,可变框架的行为方式不同选项包括:
- 没什么
- 断言
- 抛出异常
- 不要试图阻止你,不要表现出不确定的行为
上面代码的要点是,您希望在后台线程上执行昂贵的渲染操作。通常的做法是将缓冲区加倍:在后台线程中渲染为位图,然后在UI线程上的窗口中渲染位图,这通常是一种廉价的操作 我编写了窗口渲染函数和窗口对象。看起来没那么贵。这是一个很小的png图像,非常小,就像徽章大小一样。它可能是线程/指针的东西吗?就像线程复制窗口和对象,而不是我在主线程中创建的那些?那会发生吗?我使用指针和全局指针。但是图像的路径仍然是一样的。我编写了窗口渲染函数和窗口对象。看起来没那么贵。这是一个很小的png图像,非常小,就像徽章大小一样。它可能是线程/指针的东西吗?就像线程复制窗口和对象,而不是我在主线程中创建的那些?那会发生吗?我使用指针和全局指针。但图像的路径仍然是相同的。。