在QT中回调函数主要可以实现多态性,通过回调函数可以动态处理一些操作。在多线程中,当同时需要处理多个事务的时候,显然你会去创建多个线程类然后实例化,这显然会增加开发工作,当我们在线程类中加入一个回调函数,在run()函数调用这个回调函数,显然可以降低线程的耦合性,提高开发效率,在实例化这个线程时,传递实例化的回调函数到这线程中,这样就避免了线程类的重复创建。回调函数的实现主要有两种:
首先定义function的如下函数
#include
std::function
第一种:lambda表达式
我们可以通过定义如下表达式
lambdaFunction = [](const QString &s)
{
qDebug()<<"lambda :"< };
然后将lambdaFunction这个回调函数赋值给线程的回调函数中。
第二种:直接定义实现函数:
void directPrint(const QString &msg)
{
qDebug()<<"direct print:"<
lambdaFunction = directPrint;
同样的方法传入线程
具体线程实现如下:
#ifndef MYCLOCKS_H
#define MYCLOCKS_H
#include
#include
class myClocks: public QThread
{Q_OBJECT
public:myClocks(QObject *parent=0);
public:void setCallback(void(*func)(QString));protected:virtual void run();private:std::function m_func;
signals:void threadSignal(QString s);
};
QString callBackInstance();#endif // MYCLOCKS_H
#include "myclocks.h"
#include
#include"qdatetime.h"
#include"qstring.h"QString callBackInstance()
{QDateTime current_date_time =QDateTime::currentDateTime();QString current_date =current_date_time.toString("yyyy年MM月dd日 hh:mm:ss");return current_date;
}
myClocks::myClocks(QObject *parent): QThread(parent)
{m_func = nullptr;
}void myClocks::run()
{if (m_func != nullptr)m_func();auto func = [&](){callBackInstance();};setCallback(func);while(1){QString str=m_func();emit threadSignal( str);sleep(1);}
}void myClocks::setCallback(std::function func)
{m_func = func;
}