用于可变长度消息数据的队列缓冲区

时间:2013-01-26 23:50:18

标签: c data-structures

短篇小说

我需要将传入的消息数据添加到固定长度的缓冲区中 如果缓冲区已满,请用新的消息数据替换最旧的消息数据(或缓冲区中最旧的字节)。这是一种排队。
如何实现这种队列?
程序在C中,我对C的知识很少(更像是没有)。

长篇故事

我有一个程序正在接收来自设备的消息 此消息可能具有可变长度并具有关联的Id 目前,该程序仅保留为每个Id收到的最新消息 此消息由程序在内部保存,只有在有配置的情况下才显示给用户,或者如果他(实时)发送命令以获取给定Id的接收消息。 现在需要保留给定Id(不仅仅是最后一个)的几个接收消息并返回它们。 它们不需要单独退回。它们可以在一个块中返回(将几条消息视为设备返回的一块内存数据) 目前,有一个固定长度的缓冲区用于保存收到的消息,一个变量用于跟踪收到的消息长度 所以我在考虑使用现有的缓冲区,并不断向它添加新的消息。 如果另一条消息出现并且缓冲区上没有剩余空间,那么我应该覆盖最旧的消息数据。像队列一样的东西 特别是实现这种队列的最后一部分是我需要更多帮助的地方 该程序在C中,不是由我完成的,而且我对C的了解有限(不是说不存在:) 我真的应该先学习C,但现在没时间了:) 我完成了C#,Java,Javascript。

管理这个队列之王的任何帮助?

谢谢

1 个答案:

答案 0 :(得分:1)

在这种情况下,循环缓冲区会有所帮助,稍作修改,允许您在缓冲区运行时踢出最旧的条目。假设您有一些typedef struct msg {...} msg和一个此类数组message[N],那么您可以管理两个初始化为0的索引int in, out

虽然out != in可以从此数组中读取消息。您可以使用某种形式的in来实现outout = (++ out) % N;的递增。到目前为止,这与任何其他循环缓冲区没有什么不同。

现在,让我们解决一下在缓冲区已满时替换最旧的消息的问题,即当您即将执行插入时(in + 1) % N == out。使用循环缓冲区,现在非常简单。为了腾出空间,out向前推一个,允许你增加in,然后插入:

if (((in + 1) % N) == out)
{ 
    out = (++ out) % N;
}
in = (++ in) % N;
message[in] = incoming_msg;

将读者的索引out向前推,允许此位置用于最近的消息。