应用场景
函数调用分直接调用和回调,那什么情况下会想要用回调呢?
工作线程中正在上传一个文件,而UI 线程想要将上传的进度实时显示到进度条中。这个时候我们希望工作线程每更新一次progressValue,UI线程便可以获取到progressValue并更新到进度条中。回调便可以实现这样的功能。(通过工作线程发消息给UI 线程也可以实现同样的功能)
回调的使用
回调其实就是函数指针,那么这句话到底是什么意思呢?
我们真正想要调用的其实就是void UI::func(float pro)
这个函数,所以我们在workThread 类中声明了一个函数指针m_func
,并且将指针指向void UI::func(float pro)
,这样当我们执行m_func(0.5)
时,UI 线程便会在自己空闲的时候去执行它的void UI::func(float pro)
函数。(回调是异步的,所以UI 线程不一定会立马去执行这个函数)
回调函数需要声明为全局静态(why?)
class UI:
static void UI::func(float pro)
{
updateProgressbar(pro);
}
class workThread:
typedef void (__stdcall *pFunc)(float);
pFunc m_func = &UI::func;
m_func(0.5);
实际用例
//MainForrm.h
#ifndef MAINFORM_H
#define MAINFORM_H
#include "WorkThread.h"
class