【问题标题】:wxWidgets (or even OOP GUI) Multiple WindowswxWidgets(甚至 OOP GUI)多个窗口
【发布时间】:2013-01-22 23:55:06
【问题描述】:

我有点卡住了;关于在 OOP 中生成多个表单。

消息循环大部分时间是(wxWidget的情况)window->show();

bool MyApp::OnInit()
{
    MainWindow *oWindow = new MainWindow(wxT("My Window"));
    oWindow->Show(true);

    return true;
}

其他人有oWindow->run(),但无论如何我的问题是:

我创建了第二个线程,其结构与上述函数完全相同,并调用了消息循环方法。问题是窗口突然出现然后消失,这对我来说没有意义。但是,如果我打电话:

MainWindow *oWindow = new MainWindow(wxT("My Window"));
        oWindow->Show(true);
MainWindow *oWindow2 = new MainWindow(wxT("My Window"));
        oWindow2->Show(true);

它会起作用,但我不希望这样,因为我需要跟踪我创建的窗口并将它们放在单独的线程上。我能做什么?

【问题讨论】:

    标签: c++ oop user-interface window wxwidgets


    【解决方案1】:

    你不能在主线程以外的任何地方运行 wxWidgets 窗口。

    “GUI 调用,例如对 wxWindow 或 wxBitmap 的调用在辅助线程中根本不安全,并且可能会过早结束您的应用程序。这是由于多种原因,包括底层原生 API 和以下事实: wxThread 不会像 MFC 那样运行类似于其他 API 的 GUI 事件循环。”

    http://docs.wxwidgets.org/2.8/wx_wxthread.html

    顺便说一句,我无法想象在任何情况下你想做的都是一个好主意。从来没有任何需要在多个线程中调整窗口。

    Windows 程序是事件驱动的。您可以拥有任意数量的顶级窗口,但应该只有一个事件队列,以便两个窗口上的事件不会最终争用相同的资源。这就是为什么 wxWidgets 会阻止您尝试创建两个线程来处理 Windows 事件。

    【讨论】:

    • 在 WinAPI 中 - 我总是必须创建一个新线程,从回调过程中生成窗口并运行主循环。为什么会有所不同?
    • 天哪,我使用 WinAPI 创建窗口已经 10 多年了。我记得那很痛苦,虽然我不记得必须为每个窗口创建新线程。
    • 我感觉到你了。我正在开发一个 GUI 密集型项目,我首先在 winAPI 中进行了尝试。只完成了 3 个窗口,不仅它们看起来很糟糕,而且我在上面浪费了很多时间。这就是我现在使用 wxWidgets 的原因。它简单、全面且快速(我主要感兴趣的是)。只有几件事对我来说是不熟悉的,比如这里的这个问题。不过感谢您的反馈,我会检查该链接:)。
    猜你喜欢
    • 2014-07-18
    • 2020-11-09
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多