怎么设计这样的接口?

鸟类学 2016-08-18 02:48:15
加精
我写了一个dll负责收集一些不定时的传上来的数据,我想在dll中提供一接口,供dll的使用者来调用,效果就是如果一数据传上来,就会通知dll的调用者收集数据。应该怎么设计?
...全文
2899 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36018370 2016-09-01
  • 打赏
  • 举报
回复
我就是过来学习学习的
Heart09 2016-08-30
  • 打赏
  • 举报
回复
看别人扯了那么多,我就一句话:加回调通知!
辰岡墨竹 2016-08-28
  • 打赏
  • 举报
回复
引用 18 楼 jiqiang01234 的回复:
引用 17 楼 kongl123 的回复:
[quote=引用 16 楼 jiqiang01234 的回复:] lib层永远无法预料应用层在回调中会做什么耗时的操作。期望应用层回调能马上返回是不现实的,除非是自己写。
就是这个意思,所以我说尽量抛开这不可预料的东西。如果一定要用回调函数,也要把回调放到非关键线程以避免不可预测。既然这样那何不直接用事件等内核对象做通知呢。windows很多地方用回调函数,那是有三层结构,不可能把用户的回调处理函数放自己的核心线程的
我倾向于在非主线程做耗时操作(可以利用线程池),然后把“完成通知”投递到主线程,当做回调事件通知应用层。这样既不影响主线程,也可以利用多线程资源。使用boost::asio是很容易实现的,因为库内部有现成的函数可以使用。如果使用windows的原生api,稍微麻烦一些,需要自己维护一个事件通知队列。[/quote] 不用,DLL作为接收模块只要考虑接收数据就行了。尽量简化。这个多线程管理的逻辑放在DLL调用者里最好。由DLL调用者发起工作线程,等待回调,当有数据来了以后,先把数据拷贝到缓冲区,向主线程发信号、消息后立刻返回就可以了。
引用 21 楼 sbfksmq 的回复:
问题是dll(c++)模块是第一时间知道数据到达的,而且调用dll的是delphi的应用程序,delphi程序中有相关采集数据并入数据库的相关功能函数,我现在想在dll中调用delphi程序中的这个函数,自己在dll中就不用重复写采集入库的操作了,还是没想明白怎么做,如果 没有更好的办法来复用delphi的那个功能函数,我只能在dll中直接写采集入库的代码了。
http://blog.csdn.net/sushengmiyan/article/details/8623874 你可以模仿这个Delphi回调API的例子来写。 就是你在Delphi程序里实现一个处理数据到达的函数ProcessRecvData,然后,调用DLL的启动数据接收的函数,把@ProcessRecvData,作为参数传给它。DLL接收到数据时就回调ProcessRecvData这个函数,这里在C用到函数指针。 注意Delphi里的函数声明要和C里一致,参数、返回值类型要对应。 另外这个接收功能可能会卡你的Delphi主线程,最好放到一个线程里去执行接收。
qq_35978873 2016-08-27
  • 打赏
  • 举报
回复
我已经下载了手机客户端,怎么还没有5分积分?
eziowayne 2016-08-27
  • 打赏
  • 举报
回复
让使用者把函数指针注册上来。就是简单的观察者模式。
fly4free 2016-08-26
  • 打赏
  • 举报
回复
下载工作线程回调的 代码没必要直接操作UI UI界面更新的频率可以与回调的频率不一致。 只要都访问同一个 ProgressInformation 对象即可
鸟类学 2016-08-26
  • 打赏
  • 举报
回复
能根据我的这种情况说的具体点吗
nanjun520 2016-08-26
  • 打赏
  • 举报
回复
感觉最直接的就是回调函数
kongl123 2016-08-26
  • 打赏
  • 举报
回复
引用 21 楼 sbfksmq 的回复:
问题是dll(c++)模块是第一时间知道数据到达的,而且调用dll的是delphi的应用程序,delphi程序中有相关采集数据并入数据库的相关功能函数,我现在想在dll中调用delphi程序中的这个函数,自己在dll中就不用重复写采集入库的操作了,还是没想明白怎么做,如果 没有更好的办法来复用delphi的那个功能函数,我只能在dll中直接写采集入库的代码了。
找一下semaphore, 或event,都是命名的。
鸟类学 2016-08-26
  • 打赏
  • 举报
回复
问题是dll(c++)模块是第一时间知道数据到达的,而且调用dll的是delphi的应用程序,delphi程序中有相关采集数据并入数据库的相关功能函数,我现在想在dll中调用delphi程序中的这个函数,自己在dll中就不用重复写采集入库的操作了,还是没想明白怎么做,如果 没有更好的办法来复用delphi的那个功能函数,我只能在dll中直接写采集入库的代码了。
qq_35150759 2016-08-26
  • 打赏
  • 举报
回复
个人没感觉有什么问题啊
示申○言舌 2016-08-25
  • 打赏
  • 举报
回复
使用完成端口+线程池通信模型,就可以完美解决你的问题。
kongl123 2016-08-24
  • 打赏
  • 举报
回复
引用 16 楼 jiqiang01234 的回复:
lib层永远无法预料应用层在回调中会做什么耗时的操作。期望应用层回调能马上返回是不现实的,除非是自己写。
就是这个意思,所以我说尽量抛开这不可预料的东西。如果一定要用回调函数,也要把回调放到非关键线程以避免不可预测。既然这样那何不直接用事件等内核对象做通知呢。windows很多地方用回调函数,那是有三层结构,不可能把用户的回调处理函数放自己的核心线程的
jiqiang01234 2016-08-24
  • 打赏
  • 举报
回复
引用 13 楼 kongl123 的回复:
引用 12 楼 jiqiang01234 的回复:
[quote=引用 4 楼 kongl123 的回复:] [quote=引用 3 楼 jiqiang01234 的回复:] 函数指针, 用作回调
个人觉得这样做线程管理会相对乱一点。当然很多既有的系统都是这样做的
难道你的接口中要体现出使用“多线程”吗?多线程只是内部的实现而已。完全可以把通知事件只通过主线程回调,在其他的线程中做耗时的事情[/quote]这样做,这个回调实质上已经是一个通知事件了;而且,假如把lib看成系统层,lib使用者是应该层,这个系统层的机制需要应用层配合完成,作为系统边界lib应该不愿意出这种情况。如果不这样:回调函数做了需要的业务逻辑,那时间有可能不可控,所以把通知线程和处理线程绑一起,有影响lib本身功能的风险。为此,lib应该做一个专门的通知线程和回调线程,通知线程和回调线程之间的通信还是事件触发。所以本质是lib该不该管这个回调线程的问题。管,lib会增加自己的复杂性。不管,应用的层的代码从set_handler(event,callback)变成switch(event) case x: callback()的区别。管这么多做什么呢[/quote] 问题的核心在于:是否要在其他的线程回调!! 如果应用层能处理多线程回调的问题,那就好办; 如果不方便处理(比如有GUI),那还是全都投递到主线程回调 lib层永远无法预料应用层在回调中会做什么耗时的操作。期望应用层回调能马上返回是不现实的,除非是自己写。
张小飞Official 2016-08-24
  • 打赏
  • 举报
回复
回调函数或者观察者模式
jiqiang01234 2016-08-24
  • 打赏
  • 举报
回复
引用 17 楼 kongl123 的回复:
引用 16 楼 jiqiang01234 的回复:
lib层永远无法预料应用层在回调中会做什么耗时的操作。期望应用层回调能马上返回是不现实的,除非是自己写。
就是这个意思,所以我说尽量抛开这不可预料的东西。如果一定要用回调函数,也要把回调放到非关键线程以避免不可预测。既然这样那何不直接用事件等内核对象做通知呢。windows很多地方用回调函数,那是有三层结构,不可能把用户的回调处理函数放自己的核心线程的
我倾向于在非主线程做耗时操作(可以利用线程池),然后把“完成通知”投递到主线程,当做回调事件通知应用层。这样既不影响主线程,也可以利用多线程资源。使用boost::asio是很容易实现的,因为库内部有现成的函数可以使用。如果使用windows的原生api,稍微麻烦一些,需要自己维护一个事件通知队列。
line_us 2016-08-23
  • 打赏
  • 举报
回复
技术性观摩解法
wrong1111 2016-08-23
  • 打赏
  • 举报
回复
我觉得应该看场景来处理比较好。。
kongl123 2016-08-22
  • 打赏
  • 举报
回复
引用 12 楼 jiqiang01234 的回复:
引用 4 楼 kongl123 的回复:
[quote=引用 3 楼 jiqiang01234 的回复:] 函数指针, 用作回调
个人觉得这样做线程管理会相对乱一点。当然很多既有的系统都是这样做的
难道你的接口中要体现出使用“多线程”吗?多线程只是内部的实现而已。完全可以把通知事件只通过主线程回调,在其他的线程中做耗时的事情[/quote]这样做,这个回调实质上已经是一个通知事件了;而且,假如把lib看成系统层,lib使用者是应该层,这个系统层的机制需要应用层配合完成,作为系统边界lib应该不愿意出这种情况。如果不这样:回调函数做了需要的业务逻辑,那时间有可能不可控,所以把通知线程和处理线程绑一起,有影响lib本身功能的风险。为此,lib应该做一个专门的通知线程和回调线程,通知线程和回调线程之间的通信还是事件触发。所以本质是lib该不该管这个回调线程的问题。管,lib会增加自己的复杂性。不管,应用的层的代码从set_handler(event,callback)变成switch(event) case x: callback()的区别。管这么多做什么呢
jiqiang01234 2016-08-22
  • 打赏
  • 举报
回复
引用 4 楼 kongl123 的回复:
引用 3 楼 jiqiang01234 的回复:
函数指针, 用作回调
个人觉得这样做线程管理会相对乱一点。当然很多既有的系统都是这样做的
难道你的接口中要体现出使用“多线程”吗?多线程只是内部的实现而已。完全可以把通知事件只通过主线程回调,在其他的线程中做耗时的事情
加载更多回复(11)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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