#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
//动态分配空间, 不能指定父对象。
myT = new myThread;
myT2 = new thread2;
//创建子线程
thread = new QThread(this);
thread_2 = new QThread(this);
//把自定义线程和子线程对象相关联(
myT->moveToThread(thread);
myT2->moveToThread(thread_2);
//线程处理函数内部,不允许操作图形界面
connect(this,&MyWidget::startThread,myT,&myThread::myTimeout);
connect(myT,&myThread::mySignal,this,&MyWidget::dealsignal);
connect(this,&MyWidget::destroyed,this,&MyWidget::dealClose);
//线程2
connect(this,&MyWidget::startThread2,myT2,&thread2::myTimeout2);
connect(myT2,&thread2::mySignal2,this,&MyWidget::dealsignal2);
connect(this,&MyWidget::destroyed,this,&MyWidget::dealClose2);
//线程打印
qDebug() << "主线程" << QThread::currentThread();
//线程地址上传到主窗口
connect(myT,&myThread::dataReady1,this,&MyWidget::onDataReceived1);
connect(myT2,&thread2::dataReady2,this,&MyWidget::onDataReceived2);
//connect()第五个参数的作用,连接方式:默认,队列,直接
//多线程的时候才有意义
//默认的时候
//如果是多线程,默认使用队列
//如果是单线程,默认使用直接方式
//队列:槽函数所在的线程和接收者一样
//直接:槽函数所在的线程和发送者一样
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::onDataReceived1(const QString& data1)
{
ui->textEdit_1->append(data1);
}
void MyWidget::onDataReceived2(const QString& data2)
{
ui->textEdit_2->append(data2);
}
void MyWidget::dealClose()
{
on_buttonStop_clicked();
//释放自定义的子线程对象,开辟堆内存了,指针
delete myT;
}
void MyWidget::dealClose2()
{
on_buttonStop_2_clicked();
//释放自定义的子线程对象,开辟堆内存了,指针
delete myT2;
}
void MyWidget::dealsignal()
{
//启动加一,并显示到UI->LCD显示 控件上
static int i = 0;
i++;
ui->lcdNumber->display(i);
}
void MyWidget::dealsignal2()
{
//启动加一,并显示到UI->LCD显示 控件上
static int i = 0;
i++;
ui->lcdNumber_2->display(i);
}
void MyWidget::on_buttonStart_clicked()
{
//判断线程是否在运行,如果运行TRUE,则不进入按钮,
if(thread->isRunning() == true)
{
//退出按钮
return;
}
//启动线程,但是没有启动线程处理函数,
thread->start();
myT->setFlag(false);
//不能直接调用线程处理函数,
//直接调用导致,线程处理函数和主线程是在同一个线程
//MyT->myTimeout();
//只能通过 signal - slot 方式调用
emit startThread();
}
void MyWidget::on_buttonStop_clicked()
{
//判断线程是否在运行,如果不运行,则不进入按钮,
if(thread->isRunning() == false)
{
//退出按钮
return;
}
//线程退出
myT->setFlag(true);
thread->quit();
thread->wait();
}
void MyWidget::on_buttonStart_main_clicked()
{
static int i = 0;
i++;
ui->lcdNumber_main->display(i);
qDebug() << "主线程:" << QThread::currentThread();
QThread* dislpay_thread = QThread::currentThread();
void* address = static_cast<void*>(dislpay_thread);
QString addressStr = QString::number(reinterpret_cast<qint64>(address), 16);
ui->textEdit->append(addressStr);
}
void MyWidget::on_buttonStop_main_clicked()
{
}
void MyWidget::on_buttonStart_2_clicked()
{
if(thread_2->isRunning() == true)
{
//退出按钮
return;
}
//启动线程,但是没有启动线程处理函数,
thread_2->start();
myT2->setFlag2(false);
//不能直接调用线程处理函数,
//直接调用导致,线程处理函数和主线程是在同一个线程
//MyT->myTimeout();
//只能通过 signal - slot 方式调用
emit startThread2();
qDebug() << "子线程2:" << QThread::currentThread();
// QString str = QThread::currentThread();
}
void MyWidget::on_buttonStop_2_clicked()
{
if(thread_2->isRunning() == false)
{
//退出按钮
return;
}
//线程退出
myT2->setFlag2(true);
thread_2->quit();
thread_2->wait();
}
没有合适的资源?快使用搜索试试~ 我知道了~
QT框架多线程计数运行例子
共11个文件
cpp:4个
h:3个
user:1个
需积分: 0 0 下载量 190 浏览量
2023-07-22
11:27:15
上传
评论
收藏 10KB RAR 举报
温馨提示
基于QT开发的主线程与多个子线程同时启动运行程序,并同时计数,可任意拖动窗口界面不卡顿,多线程之间界面传递数据。 适用于初学者了解多线程之间的运行机制,多线程间界面中的数据传递及线程启动停止的技巧方法。
资源推荐
资源详情
资源评论
收起资源包目录
MyThreaDemo.rar (11个子文件)
MyThreaDemo
MyThreadoro.pro 682B
thread2.cpp 793B
mywidget.ui 5KB
mythread.cpp 891B
MyThreadoro.pro.user.27353e9 19KB
main.cpp 179B
mywidget.h 1KB
mywidget.cpp 5KB
thread2.h 437B
mythread.h 494B
MyThreadoro.pro.user 59KB
共 11 条
- 1
资源评论
weixin_44930801
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功