0
点赞
收藏
分享

微信扫一扫

多线程 c c++ Qt

乌龙茶3297 2022-03-18 阅读 129
qtc++c语言

c中的pthread

头文件: include <pthread.h>

pthread使用

        pthread_t tid[num_of_thread];
        for(int i = 0;i < num_of_thread;i++){pthread_create(&tid[i],NULL,callback,NULL);
        }
        for(int i=0;i<num_of_thread;i++){pthread_join(tid[i],NULL);//等待线程结束
        }

pthread_create创建线程

pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &some_argument)
四个参数:线程变量名,线程的属性指针,线程回调函数,回调函数的参数

pthread_exit 结束线程

线程结束调用实例:pthread_exit(void *retval); //retval用于存放线程结束的退出状态

pthread_join 线程等待

pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。

c++中的thread

c++ thread使用

将函数指针传给thread类,在线程中执行回调函数
    std::thread test(&MainWindow::threadHandle);
    test.detach();
detch()方法的意思就是开启子线程,并且主线程不等待子线程运行完毕,而是和子线程并行运行
join()方法的意思就是开启子线程,线程会按照开启的先后顺序同步运行

Qt中的多线程

线程操作

1.线程启动

void start(Priority priority = InheritPriority)

​ 调用后会执行run()函数,但在run()函数执行前会发射信号started(),操作系统将根据优先级参数调度线程。如果线程已经在运行,那么这个函数什么也不做。

2.线程执行

int exec()

进入事件循环并等待直到调用exit(),返回值是通过调用exit()来获得,如果调用成功则范围0。

virtual void run();

线程的起点,在调用start()之后,新创建的线程就会调用这个函数,默认实现调用exec(),大多数需要重新实现这个功能,便于管理自己的线程。该方法返回时,该线程的执行将结束。

3.线程退出

void quit()

告诉线程事件循环退出,返回0表示成功,相当于调用了QThread::exit(0)。

void exit(int returnCode = 0)

告诉线程事件循环退出。
调用这个函数后,线程离开事件循环后返回,QEventLoop::exec()返回returnCode,
按照惯例0表示成功,任何非0值表示失败。

void terminate()

终止线程,线程可能会立即被终止也可能不会,这取决于操作系统的调度策略,使用terminate()之后再使用QThread::wait()确保万无一失。

当线程被终止后,所有等待中的线程将会被唤醒。
一般情况下,都在run函数里面设置一个标识符,可以控制循环停止。然后才调用quit函数,退出线程。

4.线程等待

void msleep(unsigned long msecs)

5.线程状态

bool isFinished() const  
bool  isRunning() const     

6.线程优先级

void setPriority(Priority priority)
Priority priority() const

7. 示例

方法一: 继承QThread类(子类化QThread类)

  1. 新建子类化类
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    ~MyThread();
    void stop(void);     //控制run()里边的while()
protected:
    void run(void);    //重新实现QThread::run()自定义自己的线程

signals:

public slots:

private:
    bool m_runFlag;   //run()停止暂停标志
    int m_count;      //计数,表示程序运行
};
  1. 在主线程中实现MyThread
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_myThread = new MyThread;   
}

Widget::~Widget()
{
    delete m_myThread;    
    delete ui;
}

void Widget::on_pb_start_clicked()
{
    m_myThread->start();
}

void Widget::on_pb_stop_clicked()
{
    m_myThread->stop();
}

方法二:QObject::moveToThread()方法

QThread *thread = new QThread();
this->moveToThread(thread);
this->threadHandle();
相当于把整个类放到QThread去执行
举报

相关推荐

0 条评论