运行平台:ARM Linux
界面软件:QT
中间层代码:Linux C
目前我在做一个嵌入式软件,其中需要用到QT来做一个控制界面,其中由于平台缘故,大部分东西需要C来做。这时候我的想法是将界面、C业务层都分开来进行做,将C写的代码编译成库,提供接口给QT调用。但是由于缺乏开发经验,在工作中发现一些问题。
1.当程序运行以后,设备需要从外界传感器获取,交由C业务层处理,将处理结果显示到QT界面上。但是该如何及时的把C的处理结果传给QT界面上呢?
PS:目前我的想法是在C层定义一个结构体,如果有数据需要发送,就往这个结构体填充数据,并将此结构体标记为有效,同时向QT提供一个访问此结构体的函数fun()。 在QT上,另开一个线程循环调用fun() 来获取此数据。但是我感觉这样做效率不高,另外如果需要提交的数据类型太多的话,写代码会稍微麻烦点。
先在这里感谢大家,请大神们多多提出宝贵的建议。
------解决方案--------------------
应该通知机制,而不是轮询。
我的建议是使用 Qt 的事件机制,在C业务层,使用 QCoreApplication::postEvent() 来发送事件给 Qt GUI 。因为 C不能访问 Qt 的这些函数,可以封装一个 C函数,在初始化 C 业务层时传递给 C 业务层。比如封装下面的函数:
extern "C" {
void notifyGUI()
{
QCoreApplication::postEvent(g_ui, new YourEvent());
}
}然后注册给C业务层。
首先 C 层要提供一个注册函数,如下:
typedef void (*NotifyFn)();
void registerNotifyFunction(NotifyFn fn);
你在 registerNotifyFunctioin 中保存传入的fn,在合适的地方调用就行了。
而在 Qt 代码中这么加一句:
registerNotifyFunction(notifyGUI);
最后你需要自定义事件 YourEvent ,重写 QObject::event() 函数来处理。
OK,大功告成。
------解决方案--------------------
回调函数!!