gpt4 book ai didi

c++ - 为什么我的嵌套 QEventLoop 不能为我的 QThread 传递所有事件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:05 25 4
gpt4 key购买 nike

我在使用 QEventLoop 时遇到了问题。我想为我的单元测试创​​建一个“TimeBoundExerciser”,这样在 QEventLoop 上阻塞的 SUT 就不会阻塞其余的测试用例。具体来说,我的测试用例是确保 SUT 在超时后终止。

TimeBoundExerciser 基本上生成一个线程,在该线程上执行 SUT,等待线程终止,如果在特定时间后它没有终止,则通过 QMetaObject 在线程上调用 quit() 方法: :invokeMethod() 和一个 QueuedConnection。我希望执行 quit() 会导致我的嵌套 QEventLoop 退出,从而终止我的线程。但是,我发现永远不会调用 quit() 方法,并且线程永远不会终止。我的 TimeBoundExerciser 的代码如下:

class IExerciseTheSystem
{
void operator()() = 0;
};

class TimeBoundExerciser : private QThread
{
Q_OBJECT
public:
enum CompletionType
{
TERMINATED,
FORCE_QUIT,
QUIT
};
TimeBoundExerciser(const IExerciseTheSystem& exerciser);
CompletionType exercise(unsigned long timeoutMillis);
protected:
void run();

protected slots:
void exerciseTheSystem();
private:
const IExerciseTheSystem& exerciser;
};

TimeBoundExerciser::TimeBoundExerciser(const IExerciseTheSystem& exerciser) : exerciser(exerciser)
{

}

TimeBoundExerciser::CompletionType TimeBoundExerciser::exercise(unsigned long timeoutMillis)
{
start();
while (!isRunning())
{
msleep(10);
}

moveToThread(this);

wait(timeoutMillis);
if (!isFinished())
{
bool quitResult;
QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection, Q_RETURN_ARG(bool, quitResult));
wait();
return FORCE_QUIT;
}

return QUIT;
}

void TimeBoundExerciser::run()
{
setTerminationEnabled(true);
QMetaObject::invokeMethod(this, "exerciseTheSystem", Qt::QueuedConnection);
exec();
}

void TimeBoundExerciser::exerciseTheSystem()
{
cout << "Starting exerciser" << endl;
exerciser();
cout << "Exerciser ended" << endl;
}

exercise() 方法在主线程上执行以启动整个过程。

最佳答案

如果测试运行时间过长,可能是在某种循环处理数据中。

自然地,您的退出请求不会被传送,因为测试线程正忙于运行测试。消息不会中断线程,它们会在线程处理完前一条消息并恢复事件循环时进行处理。

关于c++ - 为什么我的嵌套 QEventLoop 不能为我的 QThread 传递所有事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3627714/

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