Qt 定时器signal/slot阻塞主线程界面

示例代码:

<span style="font-size:18px;">class bicycle : public QMainWindow
{
public slots:
    void uploadDeviceStatus();
};

bicycle::bicycle(QWidget *parent) :
    QMainWindow(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(uploadDeviceStatusSlot()));
    timer->start(1000);
}
</span>

这里定时器每秒执行一次uploadDeviceStatusSlot(),它都是在主界面线程中运行的,如果它很耗时就会导致主界面出现僵死的现象。

signal与SLOT默认是以 Qt::AutoConnection 方式连接的,如果signal与SLOT接收者在不同的线程中,就会以Qt::QueuedConnection方式连接(SLOT在接收的线程运行),否则以Qt::DirectConnection方式连接(SLOT是直接运行的).

所以就算是定时器,它产生的调用也有可能是在主线程中运行,就会挂起主界面,解决方法是把SLOT放到另一线程中的对象上。

<span style="font-size:18px;">
class Sloter : public QObject
{
    Q_OBJECT
public slots:
    void uploadDeviceStatusSlot() { bicycle->uploadDeviceStatusSlot(); } // 这里调用bicycle中的函数
};

bicycle::bicycle(QWidget *parent) :
    QMainWindow(parent)
{
    QThread *thread = new QThread();
    Sloter *sloter = new Sloter();
    QTimer *timer = new QTimer(this);
    sloter->moveToThread(thread); // 这里是关键
    connect(timer, SIGNAL(timeout()), sloter, SLOT(uploadDeviceStatusSlot())); // 连接时,signal与Sloter的对象连接
    timer->start(1000);
}</span>

作者:帅得不敢出门 程序员群:31843264

时间: 2024-08-04 20:26:55

Qt 定时器signal/slot阻塞主线程界面的相关文章

关于pthread_join函数在使用时如何不阻塞主线程的一种探索

pthread_join 函数是会阻塞主线程的,这会让很多java程序员不适应.因为在java中 start以后一个线程就执行执行了.主线程不会被阻塞. 而在linux中 join是会阻塞的. 那么如何使用join的时候 不阻塞主线程呢.我给出了一个解决方法. #include <stdio.h> #include <pthread.h> void *print_count(int c); void thread_start(); int main(int argc, char c

java阻塞主线程的实现

1.声明计数器线程个数: CountDownLatch latch= new CountDownLatch(2); 2.线程启动带参数latch: Worker worker1= new Worker("zhang san" , 5000, latch); 3.线程启动,主线程阻塞: worker1.start(); latch.await(); 4.线程run()方法中计数器技术开始: public void run(){ System. out.println("Work

网络开始---多线程---阻塞主线程(演示)(一)

1 #import "ILViewController.h" 2 3 @interface ILViewController () 4 5 @end 6 7 @implementation ILViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 13 //当前线程 ,判断这个方法在哪个线程中,可以打印这个线程,当num==1时,是在主线程中 14 //其他的在子线程中 ,不能把耗时的操作放在主线程

QT高级编程技巧(一)-- 编写高效的signal &amp; slot通信代码

关于QT的线程通信,我们都会想到signal & slot机制.先回顾下利用signal & slot机制实现控件消息处理的方法. 控件消息处理 假设我们的主界面上有一个使用ui->btn指向的QPushButton对象,要实现该对象的clicked消息处理,可以在主界面对象MainWindow上添加一个slot方法onBtnClicked,并在其构造函数中使用connect方法与ui->btn的clicked消息进行绑定,如下: MainWindow::MainWindow(

[转]QT子线程与主线程的信号槽通信-亲测可用!

近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽通信的方式,但是并不完全适合线程间的信号槽通信,这主要体现在自定义消息的传递上. 首先我们看看一般的方式:利用信号-槽发送Qt内置的元数据类型testthread.h 文件 #ifndef TESTTHREAD_H #define TESTTHREAD_H #include <QThread> #

Java实现主线程等待子线程

本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器.初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进程,直到倒数至0. join方式代码如下: [java] view plain copy package com.test.thread

Java多线程--让主线程等待所有子线程执行完毕 join

首先从公司一道笔试题开始 1 package test; 2 3 public class Test implements Runnable { 4 5 public int i = 0; 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(1000); 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printSt

JAVA进阶----主线程等待子线程各种方案比较(转)

创建线程以及管理线程池基本理解 参考原文链接:http://www.oschina.net/question/12_11255?sort=time 一.创建一个简单的java线程 在 Java 语言中,一个最简单的线程如下代码所示: Java代码   Runnable runnable = new Runnable(){ public void run(){ System.out.println("Run"); } } 可通过下面一行代码来启动这个线程: new Thread(runn

Java并发编程原理与实战六:主线程等待子线程解决方案

本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.out.println(this.getName() + "子线程开始"); try { // 子线程休眠五秒 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.