【问题标题】:wxProgressDialog somehow keeping app alive after death?wxProgressDialog 在死后以某种方式使应用程序保持活力?
【发布时间】:2023-03-17 17:10:01
【问题描述】:

我在使用 wxWidgets 时遇到了一个奇怪的问题。我有以下代码

MyFrame::OnDoSomeLongThing(...) {
    progScreen = new wxProgressDialog(text,text,number,this,wxPD_AUTO_HIDE); // wxProgressDialog *progScreen is class member
    doPartOfThing() // calls the update method at the end of it
    ....
    doLastPartOfThing() // again calls update method that pushes value to 100/100
    progScreen->Destroy();
}

MyFrame::update() {
    progScreen->Update(newValue);
}

现在是这样。我可以从字面上注释掉与 progScreen 相关的行,只需在不使用进度对话框的情况下让进程继续,毕竟,当我关闭主窗口时,我的应用程序会优雅地退出。

但是,仅使用进度对话框就可以以某种方式延长应用程序的寿命。我尝试过 Destroy(),我尝试过简单地“删除 progScreen”,并且每次都尝试过:我将关闭主框架,进程继续运行,并在某个时候以一些天文数字退出。我认为唯一可能相关的是 doPartsOfThings 方法可能会调用 boost::this_thread::sleep,因为它在我的模型类中涉及等待等等。但这不应该与我的问题有任何关系。或者它可能确实... 编辑:我想强调 progScreen->Update() 是从主(GUI)线程调用的。

所以我问,我使用 wxProgressDialog 正确吗?如果没有,应该如何使用?

感谢您的帮助!

编辑:

嗯...事实证明,删除 wxPD_AUTO_HIDE 解决了这个问题。我仍然不太确定问题是什么,但对话框甚至仍然像以前一样。应用按预期关闭。

【问题讨论】:

  • 进度和对话框的父子关系是怎么设置的?
  • 我将'this'传递给了构造函数的父窗口参数。在编辑中也记录了这一点。
  • 我猜你可以尝试移除自动隐藏样式,这样你就会看到对话框是否在完成时被销毁(我假设它是关闭的,你不知道它是否还在)。 - 听起来很像问题在显示的代码中不可见。
  • 查看编辑。事实证明,它修复了它。去搞清楚。如果您愿意,可以将其作为答案发布,或者我将发布一个自我答案。

标签: c++ dialog wxwidgets exit


【解决方案1】:

我认为您需要重写关闭应用程序的 wxApp 方法,以便它在退出之前关闭 wxProgressDialog 对象。

wxApp::OnExit

virtual int OnExit()

为任何需要的处理覆盖此成员函数 在应用程序即将退出时完成。 OnExit 在之后被调用 销毁所有应用程序窗口和控件,但在 wxWidgets 之前 清理。请注意,如果 OnInit 失败,则根本不会调用它。

这个函数的返回值目前被忽略,返回 如果覆盖它,则与基类方法返回的值相同。

假设 progScreen 是框架的公共属性,您将需要类似的东西

int myApp::OnExit()
{
  (MyFrame*)(GetTopWindow())->progScreen->Destroy()
  return wxApp::OnExit();
}

【讨论】:

  • 但它是“在销毁所有应用程序窗口和控件后调用”...那我为什么不销毁 MyFrame 的 OnClose 方法中的 progScreen 呢?我会试试这个并回复你。
  • 我怀疑这不是 wxDialog 所做的事情。您的引文甚至说它是在 窗口被销毁之后调用的。
  • 坏消息:当我使用进度对话框时,甚至没有准确地调用 OnExit,因为某些东西仍然存在。当我不使用 progScreen 并在 OnExit 处设置断点时,该行触发了 SEGFAULT,这意味着 GetTopWindow() 为 NULL,因为它已被销毁。
猜你喜欢
  • 2013-11-02
  • 2018-11-09
  • 2018-09-23
  • 2018-08-10
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多