https://www.cnblogs.com/foohack/p/7449614.html
2、
鬼马行天
https://blog.csdn.net/hanshuobest/article/details/51494743
3、
吓人的猿
https://blog.csdn.net/qq769651718/article/details/79357933
4、
一去丶二三里
https://blog.csdn.net/liang19890820/article/details/51789796
首先,先进行关于将问题说明,我要解决的是在显示界面中一个label控件中显示一个NG,但是没有一个合适的信号去把他置回。而后,还不能够让主线程给阻塞掉。
看到论坛中有这样的一个方法:
1、第一种,阻塞主线程,最简单的延时方法就是使用QThread类的sleep(n)、msleep(n)、usleep(n)
QThread::msleep(50);//阻塞延时50ms
2、第二种,不阻塞主线程
void Delay_MSec(unsigned int msec)
QTime _Timer = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
我的解决办法:就还是想着将QTimer放在子线程中。
之前做过一个小的Demo,如果线程阻塞会出现主界面不能够点击任何的空间,也就会阻塞主线程。
随便打开一个例程:
添加一个类,将其准备做成子线程。
//mytest.h
#ifndef MYTEST_H
#define MYTEST_H
#include <QTimer>
#include <QObject>
class Mytest : public QObject
Q_OBJECT
public:
Mytest();
signals:
void send_test();
public slots:
void dataCollectionSendTask();
private:
QTimer m_task_timer;
#endif // MYTEST_H
mytest.cpp
#include "mytest.h"
Mytest::Mytest()
//m_task_timer.setInterval(5000);
m_task_timer.singleShot(5000, this, SLOT(dataCollectionSendTask()));
// connect(&m_task_timer, SIGNAL(timeout()), this, SLOT(dataCollectionSendTask()));
// m_task_timer.start();
void Mytest::dataCollectionSendTask()
emit send_test();
//调用网络接口发送采集完成的数据,发送的服务器
在主界面中的操作,实例化类对象:
给出的效果就是,程序运行5s后,会将label->setText("12345678");且不会阻塞线程
参考:1、foo__hackhttps://www.cnblogs.com/foohack/p/7449614.html2、鬼马行天 https://blog.csdn.net/hanshuobest/article/details/514947433、吓人的猿 https://blog.csdn.net/qq769651718/article/details/793579...
1、一下小结不保证对,如果错误希望指正
2、Queue和Direc代表是的connect的链接方式,Qt::DirectConnection和Qt::QueuedConnection
一个线程如果有多个任务要执行,且某个任务会阻塞,导致其他要执行的没有执行,这种情况就需要用线程了. 比如:QTimer 在主线程,主线程等待用户输入会导致定时器信号没法发出去(可...
创建一个QObject类,定义
QTimer、
QThread对象,将
QTimer 移动到
QThread内执行
class MyT
imer : public QObject
Q_OBJECT
public:
MyT
imer()
: t
imerInterval(500)
thread = new
QThread(this);
t
imer = new
QTimer();
~MyT
imer()
if (t
imer->isActive())
解决
定时器同一时刻执行多条任务时
阻塞问题
普通的定时任务,
会一个一个执行,当同一时间有多个定时任务启动并且含有数据量比较大的任务时,
会阻塞其他的定时任务,这样
会产生一系列的问题;
解决办法:将定时任务放入
线程池
配置如下:
1、添加全局@EnableAsync 注解,开启对异步的支持
@EnableAsync //开启对异步的支持
@Component
public class sopServiceRecoveryController {}
2、添加@Async 注解,将该定时任务设置成异步执行
什么是线程阻塞?
在某一时刻某一个线程在运行一段代码的时候,这时候另一个线程也需要运行,但是在运行过程中的那个线程执行完成之前,另一个线程是无法获取到CPU执行权的(调用sleep方法是进入到睡眠暂停状态,但是CPU执行权并没有交出去,而调用wait方法则是将CPU执行权交给另一个线程),这个时候就会造成线程阻塞。
为什么会出现线程阻塞?
1.睡眠状态:当一个线程执行代码的时候调用了slee...
boolQObject::blockSignals(boolblock)
Qt描述:
阻塞模式下,这个对象发送的信号都
会被
阻塞,解除
阻塞后则不再
阻塞。返回值为之前状态的
阻塞情况。
Ifblockis true, s...
在 Qt 中,你可以使用 `QThread` 类来创建子线程,并使用 `QTimer` 定时器来逐行读取文本并将数据发送给主线程。下面是一个示例代码:
```cpp
#include <QThread>
#include <QTimer>
#include <QFile>
#include <QTextStream>
#include <QDebug>
class WorkerThread : public QThread
Q_OBJECT
public:
explicit WorkerThread(QObject *parent = nullptr)
: QThread(parent)
signals:
void dataReady(const QString& data);
protected:
void run() override
QFile file("your_file.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
qDebug() << "无法打开文件";
return;
QTextStream in(&file);
while (!in.atEnd())
QString line = in.readLine();
// 发送数据给主线程
emit dataReady(line);
// 等待一段时间,模拟定时器
msleep(1000);
file.close();
class MainWindow : public QObject
Q_OBJECT
public:
explicit MainWindow(QObject *parent = nullptr)
: QObject(parent)
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::dataReady, this, &MainWindow::handleData);
workerThread->start();
public slots:
void handleData(const QString& data)
// 在主线程中处理接收到的数据
qDebug() << "收到数据:" << data;
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
MainWindow mainWindow;
return a.exec();
#include "main.moc"
在上面的示例中,`WorkerThread` 类继承自 `QThread`,它负责在子线程中逐行读取文本,并使用信号 `dataReady` 发送数据给主线程。`MainWindow` 类是主线程的类,它在构造函数中创建了 `WorkerThread` 实例,并连接了信号槽来处理接收到的数据。
注意:为了使 `WorkerThread` 类能够使用信号和槽,需要在类定义前加上 `Q_OBJECT` 宏,并在文件末尾添加 `#include "main.moc"` 来启用 Qt 的元对象编译器(MOC)。
这样,子线程将按照一定时间间隔逐行读取文本并将数据发送给主线程进行处理。