美文网首页
如何正确使用QThread

如何正确使用QThread

作者: Jake_Yang | 来源:发表于2019-05-16 09:08 被阅读0次

1 Qt的线程支持

2 QThread的使用方法

2.1 继承QThread

继承QThread类,并重新实现run函数。

class ExtThread : public QThread {
private:
public:
  ExtThread : public QThread;  

protected:
  void run() {}
};

void test()
{
  ExtThread t;
  t.start;
  t.wait();
}

2.2 使用moveToThread

最规范的使用QThread方法,QObject的moveToThread函数是将对象加入到指定的线程中。

class Worker {

};

int main(int argc, char const *argv[])
{
  QCoreApplication app;
  QThread thread;
  Worker worker;
  worker.moveToThread(&thread);

  return app.exec();
}

2.3 使用信号/槽

2.4 使用QtConcurrent::run

2.4.1 运行类函数

void Worker::start()
{
  QtConcurrent::run(this, &Worker::fun1);
  QtConcurrent::run(this, &Worker::fun1);
}

void Worker::fun1()
{

}

void Worker::fun2()
{

}

2.4.2 运行全局函数

void printMes(char*mes)
{
  cout<<"pprintMes(char*mes) thread :"<<QThread::currentThreadId()<<endl;
  cout<<mes<<endl;
}

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  cout<<"mainthread:"<<QThread::currentThreadId()<<endl;
  char* mes= "hello world";
  QtConcurrent::run(printMes,mes);
  returna.exec();
}

3 场景方案

生命周期 场景 方案
无死循环 线程运行一个方法,方法结束后即退出线程 1. 定义一个函数,然后使用QtConcurrent::run()运行
2. 从QRunnable派生一个类,并利用全局线程池QThreadPoll::globalInstance()->start()运行
3. 从QTrhead派生一个类,重载QThread::run()函数,然后使用QThread::start运行
无死循环 在容器中所有项执行相同的操作。执行过程中使用所有可用的CPU核 QtConcurrent提供map()函数来将这些操作应用于容器中的每个项,filter()用于选择容器元素,以及指定一个删减函数的选项来与容器中剩下的元素进行合并
无死循环 一个耗时的操作必须在另一个线程中运行,在此期间,状态信息必须发到GUI线程 使用QThread,重载run()函数并根据情况发送信号。使用queued信号/槽连接GUI线程
死循环 有一对象位于另一个线程中,将让其根据不同的请求执行不同的操作 QObject派生一个类并实现必要的槽和信号,将对象移到一个具有事件循环的线程中,并通过queued信号/槽连接与该对象进行通信
死循环 对象位于另一个线程中,对象不断执行重复的任务(如轮询某个端口,并与GUI线程通信) 在工作者线程中使用一个计时器来实现轮询。但是最好的解决方法是完全避免轮询。使用QSocketNotifier是不错的选择

4 注意事项

  • QThread如果没有使用继承以及重新实现run方法的话,线程运行完之后,不会产生finish信号。

相关文章

网友评论

      本文标题:如何正确使用QThread

      本文链接:https://www.haomeiwen.com/subject/yehbaqtx.html