问题标签 [circular-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
14024 浏览

logging - 在磁盘上实现固定大小的日志文件或循环缓冲区

我检查了这个问题,但这不是我要找的。

我试图弄清楚如何限制日志文件的大小(比如 10MB),并且一旦它被命中,要么:

  • 开始写到开头,而不是追加,或者
  • 继续追加,但在我这样做的时候从头开始删除内容

不要真正关心语言 - 只要有可能:)


注意:我知道滚动日志文件方法(达到目标大小、重命名并继续记录)。我希望避免这样的滚动。

0 投票
2 回答
1119 浏览

pointers - 循环缓冲区指针异常

这是对这个问题的跟进:显示以前收到的 UART 值

在微控制器上实现循环缓冲区后,指针似乎有问题。

在 RS-232 上发送:ADE1234
接收(缓冲区 = 8):E24AE2 / E2AE24(在两者之间翻转) 接收(缓冲区 = 16):D234E1(跳过 A,因为它是一个同步字节)
接收(RX_BufSize = 32):DE1223 / DEE123 / DE1234 / DE12E1(随机翻转)
预期接收:DE1234

初始化

LCD 上显示的调试值

接收中断

来自源的函数

Detect_Cmd_RXD 每 1/256 秒调用一次。在此期间,UART 接收缓冲区中将至少发送 7 个值。

写入过程是否可能如此之快以至于它赶上了读取指针?除了更频繁地调用 Detect_Cmd_RXD 之外,我还能做些什么来解决这个问题?

0 投票
3 回答
2659 浏览

haskell - Haskell中的O(1)循环缓冲区?

我正在 Haskell 中进行一个需要循环缓冲区的小型概念项目。我已经设法使用具有 O(1) 旋转的数组创建了一个缓冲区,但当然需要 O(N) 进行插入/删除。我找到了一个使用列表的实现,它似乎需要 O(1) 来进行插入和删除,但由于它维护一个左右列表,因此在旋转时越过某个边界需要 O(N) 时间。在命令式语言中,我可以实现一个具有 O(1) 插入、删除和旋转的双向链接循环缓冲区。我认为这在像 Haskell 这样的纯函数式语言中是不可能的,但我很想知道我是否错了。

0 投票
1 回答
1418 浏览

vb.net - VB.NET 中的循环缓冲区

如何在 VB.NET 的堆上创建循环缓冲区?

这将用于通过 P/Invoke 对 winmm.dll waveoutopen 和 waveoutwrite 进行音频播放,以支持软件合成器的开发。

我目前使用 marshall 类在堆中构建一个常规的字节数组。

0 投票
1 回答
3033 浏览

c++ - 使用 Boost 在共享内存中创建循环缓冲区时出现问题

我正在尝试使用 Boostcircular_buffer和 Interprocess 库在共享内存中创建一个循环缓冲区。我编译并运行了Interprocess 文档中给出的示例,用于在共享内存中创建向量,没有问题。但是,当我修改它以使用 Boost circular_buffer 作为:

我得到一个编译错误(由 引起segment.construct())。知道我做错了什么吗?是不是因为circular_buffer不是 中列出的容器之一/boost/interprocess/containers,即它与 Interprocess 不兼容?

谢谢,

C

0 投票
5 回答
26953 浏览

android - 如何创建一个封闭的(圆形)ListView?

我想创建一个自定义的 ListView (或类似的),它的行为就像一个封闭的(圆形):

  1. 向下滚动 - 到达最后一项后,第一个开始 (.., n-1, n, 1, 2, ..)
  2. 向上滚动 - 到达第一个项目后,最后一个开始 (.., 2, 1, n, n-1, ..)

这在概念上听起来很简单,但显然没有直接的方法可以做到这一点。谁能指出我正确的解决方案?谢谢 !

我已经收到了答案(来自 Streets Of Boston 在 Android-Developers google groups 上),但这听起来有点难看 :) -

我通过创建自己的列表适配器(从 BaseAdapter 继承)来做到这一点。

我编写了自己的列表适配器,使其 getCount() 方法返回一个 HUUUUGE 数字。

如果选择了item 'x',那么这个item对应于adapter position='adapter.getCount()/2+x'

对于我的适配器的方法 getItem(int position),我查看了支持适配器的数组并获取索引上的项目: (position-getCount()/2) % myDataItems.length

你需要做一些更“特殊”的东西才能让它正常工作,但你明白了。

原则上,仍然可以到达列表的末尾或开头,但是如果您将 getCount() 设置为大约一百万左右,这很难做到:-)

0 投票
1 回答
2380 浏览

c++ - 为什么创建由不同进程共享的环形缓冲区如此困难(在 C++ 中),我做错了什么?

我对此特别密集,但似乎我错过了一个重要的基本点或其他东西,因为我想做的事情应该是常见的:

我需要从管理器进程 ( Process M) 创建一个固定大小的环形缓冲区对象。该对象具有从缓冲区写入/读取的方法write()read()读/写方法将由独立进程(Process RW)调用

我已经实现了缓冲区,SharedBuffer<T&>它使用 boost::interprocess 在 SHM 中分配缓冲区插槽,并在单个进程中完美运行。我已经阅读了这个问题的答案以及关于 SO 的答案以及我自己的问题,但我仍然对如何从一个公共对象有不同的进程访问方法一无所知。Boost 文档有一个在 SHM 中创建向量的示例,这与我想要的非常相似,但我想实例化我自己的类。

我目前的选择是:

  1. new正如 Charles B. 对我的问题所建议的那样,使用放置位置;但是,他警告说,将非 POD 对象放在 SHM 中并不是一个好主意。但是我的班级需要读/写方法,我该如何处理?
  2. 在我的类定义中添加一个分配器,例如,拥有SharedBuffer<T&, Alloc>并继续类似于boost 中给出的向量示例。这听起来真的很复杂。
  3. 更改SharedBuffer为 POD 类,即去掉所有方法。但是那么如何在进程之间同步读写呢?

我错过了什么?固定长度的环形缓冲区很常见,所以要么这个问题有解决方案,要么我做错了什么。

0 投票
6 回答
18940 浏览

c# - 循环缓冲区的用途是什么?

循环缓冲区有哪些用途?

使用循环缓冲区有什么好处?

它是双链表的替代品吗?

0 投票
16 回答
29414 浏览

algorithm - 在循环排序数组中搜索元素

我们希望在复杂度不大于 的循环排序数组中搜索给定元素O(log n)。示例:在 中
搜索。 13{5,9,13,1,3}

我的想法是将循环数组转换为常规排序数组,然后对结果数组进行二进制搜索,但我的问题是我提出的算法很愚蠢,它O(n)在最坏的情况下采用:

那么第i个元素的对应索引将由以下关系确定:

很明显,我的转换(从循环到常规)算法可能需要 O(n),所以我们需要一个更好的。

根据 ire_and_curses 的想法,这里是 Java 中的解决方案:

希望这会奏效。

0 投票
1 回答
5724 浏览

c - 维基百科上的内存映射循环缓冲区有多好?

我正在尝试在 C 中实现一个循环缓冲区,并且在 Wikipedia 上遇到了这个示例(2014 年 7 月删除)。看起来它会为从缓冲区读取的任何人提供一个非常好的接口,因为从缓冲区的末尾到开头的读取是自动处理的。所以所有的读取都是连续的。

但是,我有点不确定是否立即使用它,因为我在内存映射或虚拟内存方面并没有太多经验,而且我不确定我是否完全理解它在做什么。

我想我理解的是,它将缓冲区大小的共享内存文件映射到内存中两次。然后,每当数据写入缓冲区时,它会同时出现在内存中的两个位置。这允许所有读取是连续的。

如果有更多 POSIX 内存映射经验的人可以快速查看代码并告诉我使用的底层机制是否真的那么高效,那将是非常棒的。例如,我是否正确地认为 /dev/shm 中用于共享内存的文件始终保留在 RAM 中,或者它是否可以在某个时候被写入硬盘驱动器(性能下降)?有什么我应该注意的问题吗?

就目前而言,我可能会为我当前的项目使用一种更简单的方法,但最好理解这一点,以便将来在我的工具箱中使用它。

在此先感谢您的时间。