回调函数问题

rroamer 2012-01-07 09:59:15
现在其他厂家给我们提供了一个C++写的DLL,这个DLL 有20多个回调函数,然后这20多个回调函数的都具有不同的多个参数,包括了指针,integer, string等各种类型的参数。

这些回调函数是通过DLL里面的WORKER线程回调上来的,然后我需要根据这些回调函数的参数去访问主界面上的控件,更新控件内容和状态等,请问该怎么做啊?

我现在想过一个办法,就是定义一个很大的结构体,把所有的参数类型都包括在这个结构体里面,然后用POSTMESSAGE把消息POST给主界面线程去处理,但是这个方法感觉太笨了,有更巧妙一点的方法吗?
...全文
185 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cust_hf 2012-01-15
  • 打赏
  • 举报
回复
我还以为数据丢了呢。咋又出来了呢?害的我重新写了一遍。靠。
“数据表示层”和回调需要同步。同步模型是典型的生产者-消费者模型。回调是生产者,“数据表示层”是消费者。
cust_hf 2012-01-15
  • 打赏
  • 举报
回复
我就大胆的估计一下吧。不负责任哦。
楼主描述的是“这个DLL 有20多个回调函数”,估计是“这个DLL中提供了一些函数,这些函数需要楼主提供回调函数,回调函数的参数类型复杂”
回调函数的执行是由DLL里面的工作线程发起的,楼主已经能够成功的书写厂家需要的回调函数,并且能够在回调函数中取得厂家提供的数据。
但是楼主并没有说明回调函数的调用频率有多高。因为回调是厂家上报数据的渠道,所以数据的处理方式与数据量的多少,密切相关。使用PostMessage来更新界面可行的,楼主不满意的是结构比较变态。可维护性比较差。
回调处于工作线程之中,在工作线程之中更新界面。若直接更新,肯定不稳定。所以,只能在主线程之中更新。但是,可能是因为厂家提供的数据量比较大,实时性要求比较高,要求回调必须及时处理,所以,回调函数不能执行太久。必须尽快返回。不然耽搁回调的下一次执行。
搞来搞去,楼主就采用PostMessage直接更新界面了。
个人感觉,界面变化太快,人眼也看不清。所以,你更新频率那么高,跟着真实数据的变化速度来,根本没什么实际意义啊。
所以,在回调函数与主线程之间,应该不适合直接的代码耦合。数据耦合即可。正所谓高内聚,低耦合。
在回调和主界面之间增加一个“数据表示层”。这样一来的话,回调中只更新内存的变量,而不更新主界面。回调的响应速度是可以保证的。
在主界面上呢?用一个Timer来根据“数据表示层”刷新界面就行了。如果数据量确实太大,还需要回首历史数据的话,因为有了“数据表示层”的存在,要增加这个功能,只需要“数据表示层”能够把收到的数据保存到合适的存储介质(数据库或者文件)就行了。
cust_hf 2012-01-15
  • 打赏
  • 举报
回复
这哥们的描述,看起来还真有点费劲。我估计是这样的吧。

“现在其他厂家给我们提供了一个C++写的DLL,这个DLL 有20多个回调函数,然后这20多个回调函数的都具有不同的多个参数,包括了指针,integer, string等各种类型的参数。”应该是理解成“厂家给他们提供了DLL形式的API,DLL中提供了不少函数,但是为了实现数据及时反馈给调用者(非厂家代码),厂家要求使用者(楼主)提供回调函数”。所以回调函数是楼主提供的,而非厂家提供的。回调函数是厂家调用的,楼主提供的。

楼主在书写回调函数的时候,遇到了问题。虽然可以及时的获得厂家提供的数据,但是把这些数据呈现出来的时候遇到了麻烦。因为回调函数中可用参数有限,当然也许是由于回调中有线程,不在主线程中,不能安全的更新界面,反正是楼主不敢无法直接访问主界面。

像这种,既然通过回调加线程来向楼主传递数据,很有可能,数据的量很大,实时性要求也比较高。
所以,即使通过界面来呈现,人眼的时间分辨率也没达到那个精度。

所以,我建议的办法是。回调函数中只修改内存数据,而不更新用户界面。
用户界面,用一个timer来更新就行了。

蓝色光芒 2012-01-09
  • 打赏
  • 举报
回复
DLL的线程产生回调,你就不用不理会,在回调中处理数据即可,如果要在界面显示,如果回调很频繁(1秒内就有很多次的话)考虑使用Timer相关,如果回调不频繁,就在回调里给窗口发个消息,就行了.如果还有更复杂的情况,可以考虑使用内存池
代码跳动 2012-01-09
  • 打赏
  • 举报
回复
取指针 最方便,自己定义结构。
yagzh2000 2012-01-09
  • 打赏
  • 举报
回复
把你的窗体类做为一个指针给回调函数,如Pwindow=^TMainFrom; 调用其中的控件可以这样:Pwindow^.edit1.text就可以了。
erhan 2012-01-08
  • 打赏
  • 举报
回复
帮你在网上查了一下,感觉这个例子最好理解
http://zhidao.baidu.com/question/156106192.html
erhan 2012-01-08
  • 打赏
  • 举报
回复
比如,把操作主窗口的代码写到一个过程abc里,或多个过程里
在回调函数里的适当位置调用Synchronize(abc);
rroamer 2012-01-08
  • 打赏
  • 举报
回复
再次解释一下,程序已经可以运行了,回调函数也正常被调用了,我现在的问题是怎么在回调函数里面去访问主窗口里的控件,因为回调线程是DLL的WORKER线程调用的,在工作者线程里面访问主界面控件是会出错的!!

我现在在想有一个比较好的解决办法,目前想到的办法是在回调函数里面用POSTMEASSAGE把消息发给主窗口,但是这需要定义个很复杂很大的结构,因为每个回调线程的参数都很多,而且不相同。
rroamer 2012-01-08
  • 打赏
  • 举报
回复
...感觉楼上回答我问题的几个兄弟都没有明白我的意思啊。
erhan 2012-01-08
  • 打赏
  • 举报
回复
看情形,他是有说明的。
kaikai_kk 2012-01-08
  • 打赏
  • 举报
回复
这个只有开发这个dll的人知道
在这乱猜还不如找他要说明,要demo更好
bdmh 2012-01-08
  • 打赏
  • 举报
回复
按照人家的回调函数格式,自己写一个,用来传递

百度 delphi 回调函数
whisht 2012-01-07
  • 打赏
  • 举报
回复
将C++的回调函数定义翻译成delphi的,然后传递函数指针

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧