【发布时间】:2021-03-05 22:50:38
【问题描述】:
我有这个调用堆栈来执行繁重的计算:
// QML
StyledButton {
onButtonClicked: {
registeredCppClass.undoHandler.createCommand()
}
}
void UndoHandler::createCommand()
{
m_undoStack->push(new Command());
}
class Command : public QUndoCommand
{
public:
Command();
virtual ~Command();
virtual void undo();
virtual void redo();
// ...
private:
// Handler does the logic
LogicHandler *m_logicHandler;
// Output by logic handler
QString m_outputName;
};
void Command::redo()
{
if (/* */) {
} else {
// Run heavy computation
m_outputName = m_logicHandler->run();
}
}
QString LogicHandler::run()
{
// Heavy computation starts
}
意图
我打算通过this approach 实现QThread,以防止在进行大量计算时GUI 变得无响应。但是我不知道QThread和Worker类需要在哪里实现。他们应该在:
UndoHandler::createCommandCommand::redoLogicHandler::run- ... ?
考虑到信号槽连接,QThread 和 Worker 的最佳位置是什么?
【问题讨论】:
-
由于
UndoCommand类拥有逻辑处理程序,因此在同一个类中启动一个新线程并将逻辑处理程序放入构造函数中的线程中对我来说是有意义的。不利的一面是,当命令破坏时(这可能经常发生),您必须调用线程wait(),这可能需要一些时间。 -
我将拥有一个系统范围的线程池并向其提交任务。
标签: c++ multithreading qt signals-slots qthread