• Qt5多线程<12>


    1.多线程的简单实现

            <1> 在头文件threaddlg.h声明用于界面显示所需的控件,其代码如下:

    1. #ifndef THREADDLG_H
    2. #define THREADDLG_H
    3. #include
    4. #include
    5. #include "workthread.h"
    6. #define MAXSIZE 5
    7. class ThreadDlg : public QDialog
    8. {
    9. Q_OBJECT
    10. public:
    11. ThreadDlg(QWidget *parent = 0);
    12. ~ThreadDlg();
    13. private:
    14. QPushButton *startBtn;
    15. QPushButton *stopBtn;
    16. QPushButton *quitBtn;
    17. public slots:
    18. void slotStart();
    19. void slotStop();
    20. private:
    21. WorkThread *workThread[MAXSIZE];
    22. };
    23. #endif // THREADDLG_H

             <2> 在源文件“threaddlg.cpp的构造函数中,完成各个控件的初始化工作其具体代码如下:

    1. #include "threaddlg.h"
    2. #include
    3. ThreadDlg::ThreadDlg(QWidget *parent)
    4. : QDialog(parent)
    5. {
    6. setWindowTitle(tr("线程"));
    7. startBtn = new QPushButton(tr("开始"));
    8. stopBtn = new QPushButton(tr("停止"));
    9. quitBtn = new QPushButton(tr("退出"));
    10. QHBoxLayout *mainLayout = new QHBoxLayout(this);
    11. mainLayout->addWidget(startBtn);
    12. mainLayout->addWidget(stopBtn);
    13. mainLayout->addWidget(quitBtn);
    14. connect(startBtn,SIGNAL(clicked()),this,SLOT(slotStart()));
    15. connect(stopBtn,SIGNAL(clicked()),this,SLOT(slotStop()));
    16. connect(quitBtn,SIGNAL(clicked()),this,SLOT(close()));
    17. }
    18. ThreadDlg::~ThreadDlg()
    19. {
    20. }
    21. void ThreadDlg::slotStart()
    22. {
    23. for(int i=0;i
    24. {
    25. workThread[i]=new WorkThread();
    26. }
    27. for(int i=0;i
    28. {
    29. workThread[i]->start();
    30. }
    31. startBtn->setEnabled(false);
    32. stopBtn->setEnabled(true);
    33. }
    34. void ThreadDlg::slotStop()
    35. {
    36. for(int i=0;i
    37. {
    38. workThread[i]->terminate();
    39. workThread[i]->wait();
    40. }
    41. startBtn->setEnabled(true);
    42. stopBtn->setEnabled(false);
    43. }

            <3> 以上完成了界面的设计及调用线程实例,下面的内容是具体的功能实现。

            <3-1>在头文件“workthread.h”中,工作线程WorkThread类继承自QThreao类。重新实现run()函数。其具体代码如下:

    1. #ifndef WORKTHREAD_H
    2. #define WORKTHREAD_H
    3. #include
    4. class WorkThread : public QThread
    5. {
    6. Q_OBJECT
    7. public:
    8. WorkThread();
    9. protected:
    10. void run();
    11. };
    12. #endif // WORKTHREAD_H

            <3-2> 在源文件“workthread.cpp”中添加具体实现代码如下:

    1. #include "workthread.h"
    2. #include
    3. WorkThread::WorkThread()
    4. {
    5. }
    6. void WorkThread::run()
    7. {
    8. while(true)
    9. {
    10. for(int n=0;n<10;n++)
    11. qDebug()<
    12. }
    13. }

    <4> main.cpp中代码实现

    1. #include "threaddlg.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. ThreadDlg w;
    7. w.show();
    8. return a.exec();
    9. }

    <5> 运行效果,如下所示:

    2.多线程的控制

            多线程控制可通过互斥量和信号量。

    2.1 互斥量

           为了防止多个线程对同一个资源进行访问,Qt中加入互斥量,互斥量可以通过QMutex或者QMutexLocker类来实现。

     

  • 相关阅读:
    怎么用光碟重装系统
    JSD-2204-酷莎商城(管理员模块)-密码加密-Day10
    #案例:演示键盘操作!
    企业多点组网最直接、最简单的方案是什么?
    Easily Compare and Deploy SQL Database Changes
    JVM——7.类加载与类加载器
    Ubuntu 创建并发布 Django 项目
    【OpenCV】图像基本操作
    连续六个季度实现盈利改善,达达集团内外双重确定性凸显
    JAVA代码审计-XSS漏洞分析
  • 原文地址:https://blog.csdn.net/liangfei868/article/details/134325057