首页 > 其他分享 >Qt QObject::killTimer: timers cannot be stopped from another thread

Qt QObject::killTimer: timers cannot be stopped from another thread

时间:2024-03-14 14:34:17浏览次数:22  
标签:Qt thread Work QObject 线程 ui include SlotShow

QObject::killTimer: timers cannot be stopped from another thread

产生原因

1 定时器的事件处理所处的线程和调用定时器操作(方法)的线程不是同一个线程。
2 可以通过 qDebug() << QThread::currentThreadId()打印操作时的线程ID。

解决思路

把定时器的操作(方法:start(), stop())))和事件处理放在同一线程内操作。

解决方法

使用connect(ui->pushButton, SIGNAL(clicked()), w, SLOT(SlotShow()));而不是直接使用w->SlotShow();。

关键代码

 1 //mainwindow.cpp
 2 #include "mainwindow.h"
 3 #include "ui_mainwindow.h"
 4 #include <QThread>
 5 #include <work.h>
 6 #include <QDebug>
 7 
 8 MainWindow::MainWindow(QWidget *parent)
 9   : QMainWindow(parent)
10   , ui(new Ui::MainWindow)
11 {
12   ui->setupUi(this);
13   w = new Work();    //这里不能指定父对象,如果指定了父对象,moveToThread将无法移动w对象内成员所属的线程。
14   t = new QThread(this);
15   w->moveToThread(t); //这里会把对象w及其w中的成员移动到线程t中(在这之前w中的成员属于主线程)。
16   connect(ui->pushButton, SIGNAL(clicked()), w, SLOT(SlotShow())); //正确用法
17   t->start();
18   qDebug() << QThread::currentThreadId() << "MainWindow";
19 }
20 
21 MainWindow::~MainWindow()
22 {
23   t->quit();
24   t->wait();
25   t->deleteLater(); //这里由于对象t所维护的线程和主线程不属于同一线程,应该使用deleterLater进行释放。
26   delete ui;
27 }
28 
29 void MainWindow::on_pushButton_2_clicked()
30 {
31    // w->SlotShow();//错误用法
32 }
 1 //work.cpp
 2 #include "work.h"
 3 #include <QDebug>
 4 #include <QThread>
 5 #include <QTimer>
 6 
 7 Work::Work(QObject *parent) :
 8   QObject(parent)
 9 {
10   qDebug() << QThread::currentThreadId() << "Work";
11   m_t = new QTimer(this);
12   m_t->start();
13 }
14 
15 Work::~Work()
16 {
17   m_t->deleteLater();
18 }
19 
20 void Work::SlotShow()
21 {
22   std::this_thread::sleep_for(std::chrono::seconds(5));
23   m_t->stop();
24   qDebug() << QThread::currentThreadId() << "SlotShow";
25 }

 

标签:Qt,thread,Work,QObject,线程,ui,include,SlotShow
From: https://www.cnblogs.com/ybqjymy/p/18072783

相关文章

  • Qt QWidget: Must construct a QApplication before a QWidget
    在使用UI的qwidget之前都必须先构造一个QApplication实例,这是断言的意思。错误的可能是在哪个类中采彩用了静态的(static)的qwidge域或其子类,因为静态和全局对象进入main函数之前就产生了,所以早于main函数里的qapplication日对象,所以出现了此断言错误。解决方法是避免在......
  • Qt 报错: QWidget: Must construct a QApplication before a QWidget
    最近遇到一个问题,程序编译时出现报错:Mustconstructa QApplication beforeaQWidget。我的main.cpp有这样的代码1intmain(intargc,char*argv[])2{3QApplicationa(argc,argv);4}另外一个SS.h1classSS:publicQWidget2{3Q_OBJECT4public:......
  • Qt QToolBox 的常用方法
    在界面上拉一个ToolBox控件,和三个按钮控件:代码如下:1#include"widget.h"2#include"ui_widget.h"3#include<QGroupBox>4#include<QDebug>5#include<QMessageBox>6#include<QToolButton>7#include<QVBox......
  • Qt QToolBox tab 文字居中
    背景:在利用QToolBox实现一个简单的抽屉控件/导航控件时,发现QToolBox::tab的标题总是居左。尝试使用text-align属性、subcontrol-xxx属性都不起作用。解决办法:利用padding属性进行"硬编码"。代码片段如下:1//当前窗口的宽度,其中2//TOOLBOXWND_WIDTH:......
  • Qt 如何搭建Lua的运行环境
    一、Lua简介Lua是一种强大的、高效的、轻量级的、可嵌入的脚本语言。它支持过程(procedural)编程、面向对象编程、函数式编程以及数据描述。Lua是动态类型的,运行速度快,支持自动内存管理,因此被广泛用于配置、脚本编写等场景。二、Lua的优势Lua脚本可以很容易的被C/C++代......
  • Qt6.0开发 第四章 常用界面组件的使用
    第四章常用界面组件的使用在Qt类库中,所有界面组件类的字节或间接父类都是QWidget.QWidget的父类是QObject与QPaintDevice.所以QWidget是多重继承的类.QObject支持元对象系统,其信号与槽机制为编程中对象间通信提供了极大便利.QPaintDevice是能使用QPainter类在绘图设备上绘......
  • ## 利用ThreadLocal优化获取用户基本信息(2024-3-13)
    ThreadLocal提供线程的局部变量(set和get方法)线程之间互不影响//测试类packagecom.di.bigevent;importorg.junit.jupiter.api.Test;publicclassThreadLocalTest{@TestpublicvoidtestThreadLocalSetAndGet(){ThreadLocaltl=newThreadLocal......
  • 【C++】thread 头文件无法正常使用问题
    问题当我使用MinGWGCC,在windows上编写C++程序的时候,使用thread类会无法编译,有如下错误:我使用的是c++17这个问题原因是MinGWGCC当前仍缺少标准C++11及以上版本线程类的实现。解决方案Stackoverflow上的类似问题:传送门1.下载源文件:源文件外网可能比较慢,提供C......
  • JMeter接口性能压测之阶梯加压线程组(Stepping Thread Group)
    一、前言1、阶梯式场景(负载测试):该场景主要应用在负载测试只里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而有针对性的进行各方面的系统优化。2、Stepping Thread Group的作用减少服务器的瞬时压力,......
  • C# 实现Thread多线程
    在C#中,可以使用Thread类来实现多线程编程。多线程是同时执行多个任务的一种方式,每个任务在一个独立的线程中运行,有着各自的执行流和上下文。使用多线程的场景:需要同时执行多个耗时的任务,以提高程序的响应性能。需要处理实时数据,比如即时通讯、数据流处理等。需要并行执行......