前些天使用Qt的多线程写了一些东西,因为是关于视频流的处理和转发的,所以采用多线程可以有效提升CPU的效率,对于视频的处理放在主线程之外,新开一个线程对于提升响应速度,提升效率非常重要。
最开始作为入门我也想用比较普遍的方法:继承QThread并且重写 void run()函数。这个方法其实挺简单的,就是自己写一个MyThread类继承QThread,比如说:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <iostream>
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
void stop();
protected:
void run();
private:
volatile bool stopped;
};
#endif // MYTHREAD_H
这样的话,在.cpp文件中就可以
void Thread::run()
{
while(!stopped)
{
//do something...
}
stopped = false;
}
void Thread::stop()
{
stopped = true;
}
在run中可以调用该函数,在stop中就结束这个进程。
但是后来发现,如果是我自己的线程函数有参数,和返回值,run()函数就不行了,我不太清楚重载这个函数行不行,所以就试了另一种方法,这种方法对于带参数和返回值的Qt多线程是有效的:
比如说我在.h文件中有一个线程函数: uint rtsptrans(int a);
那么首先调用头文件:
#include <QtConcurrent/QtConcurrentRun>
#include <QProcess>
#include <QFuture>
然后调用的只需要用run函数调用函数与它的参数列表就行了。比如:
int integer=100;//函数的参数,这里是举一个例子
QFuture<uint> future=QtConcurrent::run(this,&video::rtsptrans,integer);//调用函数,注意后面的参数
uint res = future.result();//获得返回值