【问题标题】:How do you control a SFML window from a separate thread?如何从单独的线程控制 SFML 窗口?
【发布时间】:2020-10-06 03:19:02
【问题描述】:

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

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

谁能帮帮我?

【问题讨论】:

  • 一般来说,UI有线程亲和性,你的努力注定会失败。

标签: c++ multithreading c++11 sfml


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 2021-04-17
    • 1970-01-01
    • 2022-08-22
    • 2016-01-06
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多