c++ - 如何从单独的线程控制SFML窗口?

标签 c++ multithreading c++11 sfml

我目前正在开发一款游戏,希望创建一个加载屏幕,该屏幕基本上显示了加载所有资源的过程。为此,我决定创建一个单独的线程来处理窗口。我知道可能会有更有效的解决方案,但是我想创建一个特殊的鼠标光标,而这是唯一的一种方法,它使我能够在应用程序加载大文件时不会出现鼠标松动的情况。

我在SFML教程页面上阅读了这些线程,并了解到我必须在主线程中执行window.setActive(false),然后在单独的线程中执行window.setActive(true)才能访问单独线程中的窗口而不会出现任何问题。这可以正常工作,不会引发任何错误,并且可以很好地显示加载屏幕。但是,我无法以任何方式来回移动窗口或与之交互。加载时,鼠标光标被鼠标的蓝色环覆盖,即使我使用sf::Style::Default,我也无法关闭,移动或调整窗口大小,因此应该可以。

有人可以帮我从这里出去吗?

最佳答案

你有倒退。您在加载资源时阻止了主线程,并创建了一个新线程以使UI保持响应。从长远来看,这不仅不会很好,而且从短期来看,您的操作系统仍然认为您的应用程序已被阻止,因为主线程没有响应。操作系统不知道您创建了第二个线程来保持用户的娱乐性。

相反,您应该将响应式UI保留在主线程上,并创建一个额外的线程来执行繁重的工作和阻塞工作。这样,您就不必一直与图形库费劲(并且,是否为SFML也无关紧要,因为它们都是这样做的),而且您的操作系统也不会像阻塞了您的应用程序那样工作。

关于c++ - 如何从单独的线程控制SFML窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62409791/

相关文章:

C++ 标记化

c++ - 如何将 C++ 对象作为参数传递给函数?

c# - 是否可以使用 ISynchronizeInvoke.BeginInvoke() 重载线程?

c++ - 错误 C4716 : must return a value, 由实际返回值的函数抛出

c++ - C++ std::unordered_map 中使用的默认哈希函数是什么?

c++ - 链接静态类成员函数会引发 undefined reference 错误C++

java - 使用Runnable进行并行执行

linux - 如何理解 "/proc/[pid]/stack"?

c++ - 返回自身的函数类型

c++ - 如何使继承的虚函数不可用?