如何从一个单独的线程控制一个SFML窗口?

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

我目前正在开发一款游戏,我想创建一个加载屏幕,基本上显示所有资源的加载过程。为了做到这一点,我决定创建一个单独的线程来处理这个窗口。我知道可以有更有效的解决方案,但我想创建一个特殊的鼠标光标,这种方式是唯一允许我这样做的方式,当应用程序正在加载一个大文件时,不会有一个错误的鼠标。

我阅读了SFML教程页面上的帖子,我了解到,我必须要做 window.setActive(false) 在主线上,然后 window.setActive(true) 在单独的线程中,为了能够访问单独线程中的窗口而不出现任何问题。这样做很好,它没有抛出任何错误,而且它能很好地显示加载屏幕。然而,我不能移动窗口或以任何方式与之交互。鼠标光标在加载时被鼠标的蓝色圆环遮住了,而且我既不能关闭也不能移动或调整窗口的大小,即使我用了 sf::Style::Default所以它应该是可能的。

谁能帮我解决一下?

c++ multithreading c++11 sfml
1个回答
3
投票

你把它弄反了。你封锁了加载资源的主线程,并创建了一个新线程来保持UI的响应。这不仅在长期内不会有好的发展,而且在短期内,你的操作系统仍然认为你的应用程序被阻塞,因为主线程是不响应的。操作系统不知道你创建了第二个线程来让用户娱乐。

相反,你应该在主线程上保持响应的UI,并创建一个额外的线程来完成繁重的工作和阻塞工作。这样你就不用一直和你的图形库纠缠在一起(是否是SFML并不重要,因为它们都是这样做的),另外你的操作系统也不会表现得像你屏蔽了你的应用程序一样。

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