gpt4 book ai didi

c++ - 在单独的线程中使用 QTimer 的规范方式

转载 作者:行者123 更新时间:2023-11-30 03:20:41 27 4
gpt4 key购买 nike

我打算创建一个工作线程,它将以 1 秒的间隔更新 QTWidget(考虑到应用程序,将其视为数字时钟或进度条更新器可能是更好的类比)。

我的应用程序是特定于航空电子设备的,它计算飞行路径上的飞行跟踪信息,并在飞行过程中以 1 秒的间隔定期更新 map 或其他一些 QT 小部件(我想你可以将其视为一种进步bar - 在我的例子中,进度条可以用 map 或表格小部件代替)。该线程可能需要大约 10-20 秒来计算整个飞行数据 - (但是它几乎会立即获得第一个结果) - 这些结果需要以 1 秒的间隔发送到 GUI 以更新飞机的位置在 map 上。

关于合并更新工作线程的计时器的正确方法和错误方法存在很多混淆。我找到的最好的知识来源是 QtCon 演讲实体 Multithreading with Qt - Giuseppe D’Angelo - 似乎首选的方法是让工作人员 QObject 不子类化 QThread 并且计时器在其自己的事件处理程序中运行 - 但有很多关于将工作线程移动到另一个我不太了解的线程的困惑,我正在寻找一些关于如何正确执行此操作的规范建议。在 Lambda 中这样做是理想的,因为我可以保持逻辑和线程相对隔离,这将是理想的。

我想看看是否有人可以指出类似示例的方向(特别是如果它使用现代 Lambda)。我目前使用的是 QT 5.11.2。

我的worker对象(包含QTimer如下):

class SimulatedFlightWorker : public QObject
{
Q_OBJECT
public:
explicit SimulatedFlightWorker()
: mpMMRFlightData{}
{}
public slots:
// worker thread slot that computes the mpMMRFlightData
void importSimulatedFlight(
const QString& fileName,
const int aPlaybackSpeed);
void updateGUI(int secondsElapsed);
signals:
// every second during the flight we need to send a new MMR
// record to the GUI - to display on a spreadsheet or google map
void updateFlightData(const MMRTimedRecord& rMMRRecord);

// this is effectively when the worker thread is done
void flightCompleted();
private:
QTimer mTimer;
// the
std::unique_ptr<MMRFlightData> mpMMRFlightData;
};

这是我设置信号和槽的代码(还没有工作)

// Experimental worker model adapted from YouTube tutorial
// by Giuseppe di Angelo https://www.youtube.com/watch?v=BgqT6SIeRn4
auto thread = new QThread;
auto worker = new SimulatedFlightWorker;


connect(thread, &QThread::started, worker, &SimulatedFlightWorker::importSimulatedFlight);
connect(worker, &SimulatedFlightWorker::flightCompleted, thread, &QThread::quit);
connect(thread, &QThread::finished, worker, &SimulatedFlightWorker::deleteLater);

worker->moveToThread(thread);
thread->start();

最佳答案

其实很简单:

  1. 您的计算是在 QObject 派生类中完成的

  2. 更新是通过该对象中的信号发出的。

  3. 计算是在 10-20 毫秒的小块中完成的。

  4. 计算由零持续时间计时器触发 - 它不是计时器,而是一种检测线程中事件循环空闲状态的方法。

  5. 更新由 1 秒计时器触发。

此类可以在任何线程上运行——它甚至可以在 GUI 线程上运行,但会降低响应速度(但并非完全没有响应)。

您通常会实例化类、开始计算并将其移至专用线程。

关于c++ - 在单独的线程中使用 QTimer 的规范方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52691302/

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