有没有一种安全的方法可以在不调用 QApplication::exec() 的情况下使用 Qt?
我有许多不同的对象正在对多个资源执行长期进程(至少其中一个正在与 Web 应用程序服务器进行通信)。我正在制作一个 GUI 应用程序,提示用户在正确的时间为这些不同的过程进行输入。我希望将我的“流程”逻辑(决定下一步做什么的逻辑)放在一个地方,而不是像对话框类那样放在 GUI 对象中。我想我可以做这样的事情:
...
wait_dialog dlg;
dlg.setModal( false );
dlg.show(); // Should return...
netobject.start_long_lived_process_that_happens_on_other_thread( &completion_callback );
while ( !completion_callback_called() )
{
qApp->processEvents();
netobject.pump_callbacks();
magically_avoid_busywait_while_still_servicing_qt_somehow();
}
dlg.hide();
...
从 Qt 的角度来看,这安全吗?有没有一个“好”的实施方法magically_avoid_busywait_while_still_servicing_qt_somehow()
?
我在这里试图完成的是以尽可能最明确的方式编写我们的处理流程。我想要一个可以执行此操作的函数:
show_a_non_modal_wait_dialog()
start_some_processing_1()
wait_for_processing_1_to_finish()
dismiss_non_modal_wait_dialog()
show_modal_input_dialog()
if ( cancelled ) return
show_a_non_modal_wait_dialog()
start_some_processing_2()
wait_for_processing_2_to_finish()
dismiss_non_modal_wait_dialog()
show_modal_input_dialog()
if ( cancelled ) return
...
我真正想避免的是启动并等待 Qt 小部件和窗口内的处理。而且,处理对象本身完全独立于 Qt。我想我想做的是在单个函数中创建一个控制器,并带有一些辅助回调和状态变量。
您想要的是应用程序的主事件循环之外的事件循环。这可以使用以下方法完成QEventLoop http://qt-project.org/doc/QEventLoop.html:
wait_dialog dlg;
dlg.setModal( false );
dlg.show(); // Should return...
QEventLoop loop;
connect(&netobject, SIGNAL(done()), &loop, SLOT(quit()));
netobject.start_long_lived_process_that_happens_on_other_thread();
loop.exec(); // BLOCKING (non-busy) until quit() is called via the signal done()
虽然这是(在我看来)干净的代码,但这要求您的 netobject 类是 QObject 并实现信号done()
(这也比提供回调更干净)。
现在,您可以将整个代码包装在一个函数中,该函数本身将是一个阻塞调用,因此如果您愿意,它可以从对话框中返回一些结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)