如何在不破坏主框架的情况下终止wxWidgets消息循环
How to terminate wxWidgets message loop without destroying main frame?
我是wxWidgets的初学者。通过在MyFrame::OnClose()
事件处理程序中调用Destroy()
来终止应用程序的标准方式有问题:
在MyApp::OnInit()
中,我正在创建MyFrame
与从配置文件加载的构造函数参数(使用依赖注入)。该参数存储在MyFrame
中,并且可以在MyFrame
的生存期内更改。
当应用程序退出时,我需要MyApp::OnExit()
从MyFrame
获取此参数并保存它。所以MyFrame
一定仍然存在于MyApp::OnExit()
中。
我不喜欢在MyFrame::OnClose()
中保存这个参数,因为我不希望MyFrame
依赖于配置文件函数-这是应用程序类在更高级别的工作。
我想如果我正在创建一些东西,例如OnInit()
中的MyFrame
,那么摧毁它的完美地方是OnExit()
,对吧?因此,是否存在延迟MyFrame
到MyApp::OnExit()
销毁的正确方法?
myapp.cpp :
#include <wx/wx.h>
#include "myframe.h"
class MyApp : public wxApp {
public:
virtual bool OnInit() override;
virtual int OnExit() override;
MyFrame* m_myframe;
};
IMPLEMENT_APP( MyApp );
extern int LoadSettings();
extern void SaveSettings( int param );
bool MyApp::OnInit()
{
const int param = LoadSettings();
m_myframe = new MyFrame( "MyFrame title", param );
m_myframe->SetIcon( wxICON(aaaa) );
m_myframe->Show();
return true;
}
int MyApp::OnExit()
{
const int param = m_myframe->GetParameter();
SaveSettings( param );
m_myframe->Destroy();
return 0;
}
myframe.h :
#include <wx/wx.h>
class MyFrame: public wxFrame {
public:
MyFrame( const wxString& title, int param );
int GetParameter() const { return m_param; }
/* ... */
private:
void OnClose( wxCloseEvent& event );
int m_param;
};
myframe.cpp :
#include "myframe.h"
MyFrame::MyFrame( const wxString& title, int param )
: wxFrame( nullptr, -1, title ),
m_param( param )
{
Bind( wxEVT_CLOSE_WINDOW, &MyFrame::OnClose, this );
}
void MyFrame::OnClose( wxCloseEvent &event )
{
// Want to terminate message loop but without destroying this
// Destroy();
}
也许在MyFrame::OnClose()中你可以让它发出一个boost::信号,通知订阅者它即将被销毁?然后,当然,您将在MyApp中设置一个方法,以便在发出该信号时调用该方法,并让该方法保存该参数。
在一个稍微相关的注意事项上,我过去总是在销毁wxframe派生的对象时做类似的事情。也就是说,我会让它在销毁之前将一些信息保存到持久存储中。我处理这个问题的方法是简单地使用wxConfig。我将在wxEVT_CLOSE_WINDOW处理程序方法中获得全局wxConfig对象的句柄,然后保存我需要从那里保存的内容。对我来说,这是一个更简洁的设计。对象应该负责将自己保存到持久存储中。有另一个对象A(在你的情况下,你的MyApp对象)负责保存对象B的状态意味着对象A将始终需要保持最新的对象B的东西需要保存。在我看来,对象A最好对对象B说"嘿,救救你自己",然后让对象B处理细节。
ExitMainLoop的解决方案:
void MyFrame::OnClose( wxCloseEvent &event )
{
wxTheApp->ExitMainLoop();
}
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 在没有程序的情况下询问用户相同的事情被终止 C++
- 为什么一个指向char的C++指针在缺少null终止符的情况下充当字符串
- C++:在没有活动异常(GCC)的情况下终止调用
- 无法在线程运行方法中运行CryptoPP FileSink的情况下终止Qt线程
- C++线程:在没有活动异常的情况下终止调用
- 需要帮助以在未经用户同意的情况下停止程序终止
- 如何在不终止主应用程序的情况下卸载 ActiveX 的 ocx 以允许覆盖 ocx?
- 如何在没有任何指示终止的输入的情况下摆脱这种"loop"?
- 如何在不终止应用程序的情况下关闭GLUT窗口
- C++:如何在没有特定"interruption points"的情况下干净地终止线程
- c++程序在不执行catch块的情况下终止
- 如何在不破坏主框架的情况下终止wxWidgets消息循环
- 在没有活动异常的情况下调用c++终止
- 在没有活动异常线程的情况下终止调用
- 如何在不终止程序的情况下停止std::线程的运行
- 可变模板类终止情况下的直接访问有效,但方便类访问无法编译
- 在不终止程序的情况下将动态分配的内存返回给操作系统