与使用返回值的调用者相比,事件驱动

时间:2014-04-26 19:24:46

标签: c events event-driven

我有一个用C编写的程序,我正在思考如何设计它的一部分。

这里没有C ++,现有代码是C,所以这部分也必须是C.

基本上,我有一个文件可以拆分并组合部分数据进行传输。我只是在处理代码的接收部分。

它的工作方式如下: 如果你发送的数据没有拆分,因为它足够小(但调用者还不知道),函数只返回DATA_AVAILABLE,这样调用者就可以调用GetData()

但是,如果发送一块数据,该函数将返回PARTIAL_PACKET,并且调用者必须继续发送数据,直到函数返回DATA_AVAILABLE,因此调用者可以调用GetData()来获取完全重组的数据。

问题:这是最好的方法,还是应用某种事件系统。例如。调用者执行类似“SetOnDataReceived(& processData)”的操作,然后将数据提供给函数,而不是关心结果代码,知道一旦收到有效数据就会调用函数“processData”。

1 个答案:

答案 0 :(得分:0)

也许你可以实现一个线程来维护'ring-buffer'。线程将侦听传入的数据,并将数据存储在缓冲区中。线程还可以解析收到的数据,以描述每个数据包何时被完全接收。

然后,也许你的代码可以为调用者提供一套函数。如:

/* Initialize your ring-buffer, and start listening for packets, etc. */
int STEVE_Initialize();

/* Returns the number of fully recieved packets ready for processing. */
int STEVE_PacketsReadyCount();

/* Read a full packet from the ring-buffer and return it to the caller. */
int STEVE_FetchNextPacket();

/* Stop listening for packets, free ring-buffer, etc. */
int STEVE_Terminate();

投票方法 给定这样的实现,调用者可以使用'Steve_PacketsReadyCount()'来实现轮询循环。当数据包准备就绪时,调用者将调用'STEVE_FetchNextPacket()'来获取下一个完整数据包(此时,它将从环形缓冲区中删除)。

信号方法 更精细的实现可能是使用系统信号(例如USR1信号)来向呼叫者发信号通知完整数据包已就绪。调用者将提醒来自调用者实现的信号处理程序的完整数据包的完整到达。

SEMAPHORE METHOD 也许你的代码可以为客户端提供一个信号量,客户端可以使用该信号量“睡眠”直到完整的数据包到达。

可能会使用更多方法,包括某种消息队列实现。无论它是设计的,也许对架构最重要的输入是“对调用者来说最简单的”。为了更全面地回答您的问题,需要有关呼叫者需求的更多详细信息。