有没有一种安全的方式来使用Qt而不调用QApplication :: exec()?有没有办法在没有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。我想我正在尝试做的是用一个辅助回调和状态变量在一个函数中创建一个控制器。
我想我不知道为什么你需要暂停事件处理。我相信设置为0毫秒的QTimer会在gui有机会时运行,并且可以用来从其他线程收集信号以在gui线程上运行代码并避免任何线程死亡。所以你是线程对象(QThread)可以处理它的业务,并在需要输入时发出信号,然后停止自己。 gui线程捕获该信号,提示用户,给线程结果。然后该线程可以继续。或者我误解了? – Thadeux
我们的应用程序在Qt-bits和我们其他应用程序之间有明确的分界线。我们的大多数源文件(包括上面的主函数)都没有通过moc工具运行,也不能发送或接收Qt信号。 –
尽管挂起QApplication的空闲时间可能会执行此功能,但这意味着该功能必须重新输入,并且会成为一个丑陋的状态机器。我所希望的是一个可以从头到尾运行的单一功能 - 这将使程序流程非常明确。 –