首页 > 解决方案 > 如何从单独的线程控制 SFML 窗口?

问题描述

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

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

有谁可以帮我离开这里吗?

标签: c++multithreadingc++11sfml

解决方案


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

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


推荐阅读