使用场景和原因:控制类与GUI类分开是很正常的事,控制类中的状态发生变化,GUI也要有相应的切换或变换,如果在GUI中使用线程等待外部触发事件,该种方式也是可以的。之所以这里要使用回调,只是觉得当改变的状态多了,需要的线程会增加,事件也增加,觉得繁琐。不过使用回调也有一定的缺陷,代码阅读起来不是很直观,自己写得看起来可能还好,别人就不一定能找立即看明白了。下面只是简单地贴下实验的小Demo供自己参考:
#include <iostream>
typedef std::function<void(vector<int> data,void* obj)> Func;
class Gui
{
public:
Gui() {}
static void publishData(vector<int> data, void* obj)
{
Gui* gui = (Gui*)obj;
if (gui)
gui->setData(data);
}
void setData(vector<int> data)
{
m_data = data;
for (int i=0;i<data.size();++i)
{
std::cout << data.at(i);
}
}
vector<int> m_data;
};
class Machine
{
public:
Machine() {}
void registerCallback(Func fun,void* obj)
{
m_fun = fun;
m_obj = obj;
}
void pulish(vector<int> data)
{
m_fun(data, m_obj);
}
Func m_fun;
void* m_obj;
};
int main()
{
Gui a;
Machine b;
b.registerCallback(a.publishData, &a);
vector<int> vecData;
vecData.push_back(1);
vecData.push_back(2);
vecData.push_back(3);
b.pulish(vecData);
return 0;
}