QT多线程实例

  1. 自定义信号与槽
  2. Qt多线程简单实现
  3. 多线程间变量传递

工程结构

主线程类:

//export_key.h#ifndef EXPORT_KEY_H#define EXPORT_KEY_H#include "main_widget.h"namespace Ui {
class export_key;
}
class texport_work;
class export_key : public QWidget
{
    Q_OBJECTpublic:    explicit export_key(QWidget *parent = 0);
    ~export_key();public slots:    int send_cmd(int *len, uchar *pk);private:
    Ui::export_key *ui;    //工作线程对象指针,在类实现中new对象work_thread
    texport_work *work_thread;
    uchar cmd[1024];
    uchar kek[16];
};#endif // EXPORT_KEY_H12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829
//export_key.cpp#include "export_key.h"#include "ui_export_key.h"#include <QMessageBox>//#define printpkexport_key::export_key(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::export_key)
{
    ui->setupUi(this);    //实例化 工作线程的对象
    **work_thread = new texport_work();**    //连接主线程和工作线程,信号处于工作线程,槽位于当前主线程,注意保持信号和槽的参数一致!
    //connect的第五个参数必须为阻塞队列连接,这样才能保证信号传递过来的参数和槽接收的是实时的!
    **connect(work_thread,SIGNAL(send_export_signal(int *,uchar *)),this,SLOT(send_cmd(int *,uchar*)),Qt::BlockingQueuedConnection);**

}//槽的实现int export_key::send_cmd(int *len,uchar* pk)
{
    work_thread->stop();  
    //接收来自工作线程信号传递过来的参数
    mymemcpy(cmd,pk,*len);#ifdef printpk
    int n = 0;    uchar cmd2[2048] = {0};
    n = hextostr(cmd,*len,cmd2);
    cmd2[n] = ‘\0‘;
    qDebug("send pk:%s \n",cmd2);#endif

    ui->pbenter->setEnabled(true);    return ErrCode_NoErr;

}
export_key::~export_key()
{
    delete ui;
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454612345678910111213141516171819202122232425262728293031323334353637383940414243444546

工作线程类:

#ifndef EXPORT_WORK_H#define EXPORT_WORK_H#include <QThread>#include "main_widget.h"//继承Qthread基类,重写虚函数runclass texport_work : public QThread
{
    Q_OBJECTpublic:     texport_work();protected:     void run();//自定义信号**signals:    void send_export_signal(int *,uchar *);**private:     volatile int start_export;    
};#endif // EXPORT_WORK_H12345678910111213141516171819202122232425261234567891011121314151617181920212223242526
//export_work.cpp#include "export_work.h"#include "export_key.h"#include <QThread>texport_work::texport_work()
{
    start_export = 0;

}//重写虚函数run,在虚函数中实现要在工作线程中要做的事情,开启事件循环void texport_work::run()
{    while(!start_export)
    {
        qDebug()<<"start thread!";
        timerThread();//自定义函数
    }

    start_export = 0;

}void texport_work::stop()
{
    start_export = 1;

}void texport_work::timerThread()
{    int len = 0;    uchar buf[1024];

    len = serial::GetSerialPtr()->recvcommdata(buf);

    if(len <= 0) return;
    if(buf[0] == 0xAA)
    {
        if(buf[1] || buf[2] || buf[3] || buf[4] != 16) return;        //发射信号,自定义信号send_export_signal并将变量len和数组buf传递给槽函数。
        emit send_export_signal(&len,buf);
    }

}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849501234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

总结: 
1.跨线程连接信号与槽时注意连接方式,也就是connect函数第五个参数 
2.实现多线程方式,工作线程继承Qthread基类,重写虚函数run在run中实现工作线程需要做的事情;在主线程中创建工作线程的实例,可以对工作线程进行控制。 
3.多线程间传递变量的一种是直接通过信号与槽的连接实现,注意连接方式

时间: 2024-12-14 18:48:41

QT多线程实例的相关文章

Qt多线程学习:创建多线程

[为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题能够用事件处理和多线程来解决. [Linux有线程的概念吗?] 传统的UNIX系统也支持线程的概念,但一个进程里仅仅同意有一个线程,这样多线程就是多进程.Linux下的Posix线程(pthreads)是一种轻量级的进程的移植性实现,线程的调度由内核完毕,每一个线程都有自己的编号.假设使用线程,整体

QT多线程[转]

Qt作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt提供了丰富的多线程编程支持.从 2.2 版本开始,Qt主要从下面三个方面对多线程编程提供支持:一.构造了一些基本的与平台无关的线程类:二.提交用户自定义事件的 Thread-safe方式:三.多种线程间同步机制,如信号量,全局锁.这些都给用户提供了极大的方便.不过,在某些情况下,使用定时器机制能够比利用 Qt本身的多线程机制更方便地实现所需要的功能,同时也避免了

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

Qt 多线程程序设计

看到一篇好文章,特地转载下来,很详细很全面,收藏之. 原文地址:  http://blog.21ic.com/user1/1425/archives/2009/64057.html QT 多线程程序设计 QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

java swing实现的多线程实例代码教程-赛马demo

代码下载:http://www.zuidaima.com/share/1825492473826304.htm 原文:java swing实现的多线程实例代码教程-赛马demo 项目截图: 运行截图: java swing实现的多线程实例代码教程-赛马demo,布布扣,bubuko.com

Java多线程-实例解析

Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法.2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法.3.实现Callable接口,重写call方法.Callable接口与Ru

Qt 多线程和网络编程学习

一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run()函数是在start()函数调用之后开始执行 QMutex类,互斥量/互斥锁,加锁解锁,原子操作 QWaitCondition类,一个线程在一定条件下等待其它线程的唤醒,在此之前一直处于休眠期.QWaitCondition::wakeOne()随机唤醒一个等待的线程,QWaitCondition::

Linux多线程实例练习 - pthread_cancel()

Linux多线程实例练习 - pthread_cancel 1.代码 xx_pthread_cancel.c #include <pthread.h> #include <stdio.h> #include <unistd.h> #define debug_Msg(fmt, arg...) do{ printf("%s %d : ", __FILE__, __LINE__); printf(fmt, ##arg); }while(0) #define