Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在线程中渲染时,窗口内容混乱_Multithreading_C++11 - Fatal编程技术网

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

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

因此,当我像这样运行我的程序时,弹出的窗口很好,带有我之前附加的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,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图像,非常小,就像徽章大小一样。它可能是线程/指针的东西吗?就像线程复制窗口和对象,而不是我在主线程中创建的那些?那会发生吗?我使用指针和全局指针。但图像的路径仍然是相同的。。