有没有一种安全的方法可以在不调用QApplication::exec()的情况下使用Qt?
我有许多不同的对象正在多个资源上执行长时间的进程(其中至少一个正在与Web应用程序服务器通信)。我正在制作一个GUI应用程序,在正确的时间提示用户输入这些不同进程。我希望我的“流程”逻辑 - 确定下一步要做什么的逻辑 - 在一个地方而不是在GUI对象(比如对话框类)中。我想做像这样的事情:
我有许多不同的对象正在多个资源上执行长时间的进程(其中至少一个正在与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完全独立。我想做的是在一个单一的函数中创建一个控制器,其中包括一些辅助回调和状态变量。
netobject
传递给所有GUI窗口和对话框,并让它们启动处理(在我看来,这样会掩盖整个连接/处理流程)。 - Ted Middleton