gpt4 book ai didi

c++ - Qt (c++) - 是否可以使用信号从方法返回?

转载 作者:太空宇宙 更新时间:2023-11-04 13:31:41 26 4
gpt4 key购买 nike

我正在开发一个应用程序,它可以拍摄图像并进行测量并绘制到图像上。这一切都是在一个方法中完成的,该方法由涉及用户鼠标输入的几个步骤组成。使用工具栏上的按钮调用此方法。

我想知道是否可以在完成执行之前从该函数返回。这似乎合乎逻辑,如果在执行这些步骤的过程中按下按钮,它将“取消”第一个实例并启动这些步骤的新实例。或者换句话说,如何简单地取消该方法的执行?

我能想到的一种方法是使用信号设置一个标志,并在执行每个步骤后检查该标志。如果标志 == true,则返回。似乎应该有更好的方法来执行此操作,而不是几个 if 语句。

最佳答案

可以使用线程来做到这一点,另一个问题是停止它。您可以在执行每个流程步骤之前检查它......所以示例实现可能看起来像这样? Worker 在自己的线程中执行步骤(定时器模拟一些 Action )。如果再次调用开始,步骤链将被新的替换。另一个问题是如何处理当前步骤被替换,但这是另一个问题。

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();
}

顺便说一句,这个 poc 是一个很大的内存泄漏 :)

关于c++ - Qt (c++) - 是否可以使用信号从方法返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com