我正在开发一个应用程序,它可以拍摄图像并进行测量并绘制到图像中。这一切都是在一个方法中完成的,该方法包含涉及鼠标用户输入的几个步骤。使用工具栏上的按钮调用此方法。
我想知道在完成执行之前是否可以从此函数返回。似乎合乎逻辑的是,如果在执行这些步骤的过程中按下按钮,它将会取消"取消"第一个实例并启动这些步骤的新实例。或者换句话说,如何简单地取消执行此方法?
我能想到的一种方法是使用信号设置一个标志,并在每个步骤执行后检查该标志。如果flag == true,则返回。似乎应该有更好的方法来做这个,而不是几个if语句。
答案 0 :(得分:0)
可以使用线程执行此操作,其他问题是停止它。您可以在执行每个流程步骤之前检查它... 那么示例实现可能如下所示? Worker在自己的线程中执行步骤(计时器模拟某些操作)。如果再次调用start,则步骤链将被新的替换。其他问题是如何处理当前被替换的步骤,但这是另一个问题。
class Step
{
public:
virtual ~Step() {}
void setNextStep( Step* next )
{
successor = next;
}
Step* nextStep()
{
return successor;
}
virtual void process() = 0;
private:
Step* successor;
};
class Step1 : public Step
{
virtual void process()
{
std::cout << "Step1" << std::endl;
}
};
class Step2 : public Step
{
virtual void process()
{
std::cout << "Step2" << std::endl;
}
};
class Step3 : public Step
{
virtual void process()
{
std::cout << "Step3" << std::endl;
}
};
class Worker : public QObject
{
Q_OBJECT
public:
Worker( QObject* parent = 0 ) : QObject( parent ), timer( this )
{
QObject::connect( &timer, SIGNAL(timeout()), this, SLOT(work()));
}
public slots:
void start()
{
Step1* fStep = new Step1();
Step2* sStep = new Step2();
Step3* tStep = new Step3();
fStep->setNextStep( sStep );
sStep->setNextStep( tStep );
currentStep = fStep;
if( !timer.isActive() )
{
timer.start( 1 );
}
}
void work()
{
currentStep->process();
currentStep = currentStep->nextStep();
if( !currentStep )
{
std::cout << "finished";
timer.stop();
//test one run emit
emit quit();
}
}
void stop()
{
std::cout << "stop" << std::endl;
timer.stop();
emit quit();
}
signals:
void quit();
private:
QTimer timer;
Step* currentStep;
};
int main( int argc, char* argv[] )
{
QCoreApplication a( argc, argv );
Worker* worker = new Worker();
QThread* thread = new QThread();
worker->moveToThread( thread );
QObject::connect( thread, SIGNAL(started()), worker, SLOT(start()) );
QObject::connect( thread, SIGNAL(finished()), &a, SLOT(quit()) );
QObject::connect( worker, SIGNAL(quit()), thread, SLOT(quit()) );
QTimer::singleShot( 0, thread, SLOT(start(Priority)));
return a.exec();
}
BTW这个poc是一个很大的内存泄漏:)