qt 启动新线程执行定时器

    编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。

主窗口类头文件加入:

QThread* _voiceThread;
QTimer* _voiceTimer;

构造函数加入:

// 使用一个线程,跑定时器
_voiceThread = new QThread;
_voiceTimer = new QTimer;
_voiceTimer->setSingleShot(true);
// 在moveToThread前先启动定时器,不然不在一个线程里,直接调用start会失败
_voiceTimer->start(200);
_voiceTimer->moveToThread(_voiceThread);
// 定时器对象和this不在一个线程里面,因此这边指定了连接方式为Qt::DirectConnection,由定时器所在线程直接触发_onVoiceTimeout
connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection);
// 连接定时器槽,用来停止定时器
connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop()));
_voiceThread->start();


析构函数加入:

emit stop();
_voiceThread->quit();
_voiceThread->wait();

delete _voiceTimer;
delete _voiceThread;

定时器槽:


void Test::_onVoiceTimeout()
{
 // 执行任务
 // ...
 _voiceTimer->start(1000);
}


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 QML 中,可以通过使用 JavaScript 和 Qt QML Timer 组件来实现在线程执行定时器。具体步骤如下: 1. 创建一个的 Worker 对象,并将其绑定到 QML 上下文中。 2. 在 Worker 对象中创建一个Qt QML Timer 对象,并将其设置为自动重复,并设置定时器的时间间隔。 3. 在 Worker 对象中,将定时器的信号与一个 JavaScript 函数连接起来,以便在定时器触发时执行该函数。 4. 在主线程中,通过调用 Worker 对象的 start() 函数来启动线程。 下面是一个简单的示例代码,演示了如何在 QML 中实现在线程执行定时器: ``` import QtQuick 2.0 WorkerScript { id: worker function startTimer() { var timer = Qt.createQmlObject("import QtQuick 2.0; Timer { interval: 1000; running: true; repeat: true }", worker); timer.triggered.connect(handleTimer); } function handleTimer() { console.log("Timer triggered in worker thread"); } } Button { text: "Start Timer" onClicked: { worker.start(); worker.sendMessage({ type: "startTimer" }); } } ``` 在这个示例中,当用户单击按钮时,会启动一个的 Worker 线程,并在该线程中创建一个定时器。当定时器触发时,会执行 handleTimer() 函数。请注意,这个函数是在 Worker 线程执行的,而不是在主线程执行的。 如果您需要在定时器执行更复杂的操作,可能需要使用 Qt 的多线程模块来管理线程和通信。但是,对于简单的定时器任务,使用上述方法可能已经足够了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值