最近在工作中遇到一个需求,多线程情况下想把函数"存起来",每隔一定时间取一个存的最早的调用,于是想到了用缓冲区+STL的function方法来实现,特此记录一下用法.
讲解
我们在类内创建一个缓冲区QList<std::function<void()>> m_lFunc;
专门用于存放各种函数
添加函数的时候使用QList自带的push_back放入m_lFunc.push_back(std::bind(&MainWindow::getNum, this, i));
然后使用m_lFunc.front()
取一个函数,用m_lFunc.front()();
调用它.
std::bind用法
绑定成员函数,第一个参数是类名+域作用符::
+函数的名称,第二个参数是对象的指针,后面按顺序依次添加该函数的参数
实例代码:每次点击按钮时执行一个函数
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QProxyStyle>
#include <QStyleOptionTab>
#include <QObject>
#include <QDebug>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void printLog(QString qsStr);
void getNum(int iNum);
private slots:
void on_pushButton_clicked();
private:
QList<std::function<void()>> m_lFunc;
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <functional>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i = 1; i <= 10; i++){
m_lFunc.push_back(std::bind(&MainWindow::getNum, this, i));
}
m_lFunc.push_back(std::bind(&MainWindow::printLog, this, "测试信息"));
}
void MainWindow::printLog(QString str){
qDebug() << "日志打印:" << str;
}
void MainWindow::getNum(int iNum){
qDebug() << "当前序号:" << iNum;
}
void MainWindow::on_pushButton_clicked()
{
if(m_lFunc.isEmpty())return;
m_lFunc.front()();
m_lFunc.pop_front();
}
MainWindow::~MainWindow()
{
delete ui;
}