问题标签 [buffering]

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 投票
7 回答
11447 浏览

perl - “select((select(s),$|=1)[0])” 在 Perl 中做了什么?

我见过一些用 Perl 编写的可怕代码,但我无法理解这个代码:

它在我们用来与服务器通信的一些网络代码中,我认为它与缓冲有关(因为它设置了$|)。

但我无法弄清楚为什么会有多个select调用或数组引用。谁能帮我吗?

0 投票
5 回答
10957 浏览

winapi - Win32:写入文件而不缓冲?

我需要创建一个新的文件句柄,以便对该句柄的任何写操作立即写入磁盘。

额外信息:句柄将是子进程继承的 STDOUT,因此我需要该进程的任何输出立即写入磁盘。

研究CreateFile文档,FILE_FLAG_WRITE_THROUGH标志看起来正是我所需要的:

写操作不会经过任何中间缓存,它们会直接进入磁盘。

我写了一个非常基本的测试程序,但是它不工作。我在 CreateFile 上使用了标志,然后WriteFile(myHandle,...)在一个长循环中使用,在大约 15 秒内写入大约 100MB 的数据。(我添加了一些Sleep())。

然后我建立了一个专业的监控环境,包括在资源管理器中连续点击“F5”。结果:文件保持在 0kB,然后在测试程序结束时跳转到 100MB。

接下来我尝试的是在每次写入后手动刷新文件,使用FlushFileBuffers(myHandle). 正如预期的那样,这使得观察到的文件大小变得良好且稳定。

那么,我的问题是,不应该在手动刷新文件的情况下FILE_FLAG_WRITE_THROUGH做到这一点吗?我错过了什么吗?在“真实世界”程序中,我无法刷新文件,因为我无法控制正在使用它的子进程。

还有一个FILE_FLAG_NO_BUFFERING标志,出于同样的原因,我不能使用它 - 无法控制使用句柄的进程,因此我无法按照该标志的要求手动对齐写入。

编辑:我做了一个单独的项目,专门用于观察文件大小的变化。它使用 .NETFileSystemWatcher类。我也写了更少的数据——总共大约 100kB。

这是输出。查看时间戳中的秒数。

“内置无缓冲区”版本:

...和“强制(手动)刷新”版本(FlushFileBuffers()每约 2.5 秒调用一次):

0 投票
4 回答
11232 浏览

c - 为什么 printf() 在 sleep() 之前不打印任何内容?

我只是在用 Kernighan 和 Ritchie 的书学习 C;我在第四章的基础知识(“功能和程序结构”)。前几天我对这个函数产生了好奇sleep(),所以试着像这样使用它:

问题是程序的输出,它看起来像sleep()第一个然后是printf(),换句话说,它等待五秒钟然后打印字符串。所以我想,也许程序sleep()太快了,以至于它不能让printf()他的工作像我想要的那样完成,那就是打印字符串然后睡觉。

如何显示字符串然后让程序进入睡眠状态?编译器是 OpenBSD 4.3 中的 GCC 3.3.5 (propolice)。

0 投票
1 回答
1456 浏览

c# - 缓冲媒体内容,同时使用 C# 在 Windows Media Player 中播放另一个媒体内容

我正在用 C# 开发一个应用程序,它有一个嵌入了 Windows Media Player 的表单。我的应用中有几个指向某些在线内容的链接。我希望用户通过单击按钮将内容从一个更改为另一个。由于 WMP 在缓冲下一个内容时花了一些时间,所以我想继续播放当前内容。类中有一个称为“缓冲”的事件AXWindowsMediaPlayer,当媒体播放器完成缓冲内容时发出信号。但我无法使用单个 AXWindowsMediaPlayer 对象来实现这一点。无论我做什么,我都无法在缓冲第二个内容的同时继续播放第一个内容。:(

有任何想法吗?

提前致谢。

0 投票
4 回答
24483 浏览

logging - 如何在不从 stdout 和 stderr 缓冲的情况下记录 make 输出

我在从自动构建记录到输出时遇到问题。

构建是使用 Makefile 和 makefile 实用程序完成的。

问题是像编译器命令行这样的正常输出会转到 stdout,而编译错误会转到 stderr。

我想从构建中获取输出,就像它在屏幕上显示的那样。所以像:

我尝试过的(来自 ksh 脚本)是:

制作 -k > build.log 2> build.log

这会产生一个日志文件,但问题是流被缓冲,因此日志文件中的结果全部混淆了。

我可以将输出捕获到 2 个单独的日志文件中,但是我没有关于如何将它们重新粘合到一个日志文件中的信息。

在这种情况下,有没有办法关闭 stdout 和 stderr 的缓冲?

0 投票
4 回答
3827 浏览

python - python中是否有COMMIT模拟用于写入文件?

我打开了一个文件以供写入,并且一个进程运行了几天——在相对随机的时刻将某些内容写入文件。我的理解是——在我执行 file.close() 之前——有可能没有任何东西真正保存到磁盘上。真的吗?

如果主进程还没有完成,系统崩溃了怎么办?有没有一种方法可以每隔......比如说——10分钟(我自己称之为提交——不需要运行计时器)进行一次提交?file.close() 和 open(file,'a') 是唯一的方法,还是有更好的选择?

0 投票
3 回答
1806 浏览

asp.net - 视频流 asp.net

我一直在制作一个 ASP 网站,在该网站中,我为用户提供了上传视频并在上传后查看它们的设施。我已经成功地将视频上传到我的服务器,但不知道如何在客户端页面上播放它。我想缓冲视频并将其流式传输到用户的浏览器,不希望他在播放前等待并下载整个视频。我该如何接近?

0 投票
5 回答
4266 浏览

iphone - 使用 Core Graphics/Cocoa,您可以从后台线程绘制位图上下文吗?

我在屏幕外绘制到一个CGContext创建的 using CGBitmapContextCreate,然后CGImage从中生成一个 withCGBitmapContextCreateImage并将其绘制到我的视图中drawRect(我还在上面绘制了一些其他的东西 - 这是一个隔离不同级别的可变性和复杂性的练习)。

当它全部在主线程上运行时,这一切都很好。然而,以这种方式拆分的动机之一是让屏幕外部分可以在后台线程上运行(我认为这应该没问题,因为它没有渲染到屏幕上下文)。

但是,当我这样做时,结果图像是空的!我检查了代码,并放置了明智的 NSLog 以验证一切都以正确的顺序发生。

我的下一步是将其归结为重现问题的最简单的代码(或找到我遗漏的一些愚蠢的东西并修复它)——如果有必要,我会在此处发布一些代码。但我首先想在这里检查一下我不会走错路。我在 googlesphere 的旅行中找不到任何可以说明问题的东西——但一位朋友确实提到他在尝试在后台线程中调整图像大小时遇到​​了类似的问题——这表明这里可能存在一些一般限制。

[编辑]

感谢您到目前为止的回复。如果没有别的,他们告诉我,至少我不是唯一一个对此没有答案的人——这是我想知道的一部分。在这一点上,我将把额外的工作放在尽可能简单的示例上,并且可能会返回一些代码或更多信息。同时保持任何想法:-)

需要提出的一点:有几个人在API 方面使用了术语线程安全。应该注意的是,在这种情况下有两种类型的线程安全:

  1. API 本身的线程性——即它是否可以在多个线程中使用(全局状态和其他重入问题,例如 C 的 strtok 是 API 可能不是线程安全的常见原因)。
  2. 单个操作的原子性 - 多个线程是否可以通过 API 与相同的对象和资源进行交互,而无需应用程序级锁定?

我怀疑到目前为止提到的是第一种类型,但如果你能澄清一下,我将不胜感激。

[edit2 - 解决了!]

好的,我得到了一切工作。执行摘要是问题出在我身上,而不是位图上下文本身。

在我的后台线程中,就在我进入位图上下文之前,我正在对其他一些对象进行一些准备。事实证明,间接地,对导致 setNeedsDisplay 在某些视图上调用的其他对象的调用!通过将执行此操作的部分分离到主线程,它现在一切正常。

因此,对于遇到这个问题的人想知道他们是否可以在后台线程上绘制位图上下文,答案是可以(这里和答案中已经提出了警告)。

谢谢大家

0 投票
1 回答
421 浏览

c++ - 2 个或更多进程如何与键盘交互?

我一直在考虑键盘处理。它是如何工作的?我似乎无法用谷歌搜索我的解释。

我知道每次按下一个键都会产生一个键盘中断。处理器暂停它正在处理的任何事情,并从键盘缓冲区加载键盘数据,将其存储在系统级缓冲区中。

但接下来会发生什么?让我们举一个实际的例子。当我运行以下代码时会发生什么:

是否cin从系统级键盘缓冲区的用户级表示中读取?这在我的脑海中非常有意义,因为可以从同一个缓冲区读取 2 个或更多进程,这样我就不会松开任何按键。但它是这样工作的吗?

我知道我说的是非常笼统的说法。我使用的操作系统是 OS X。

0 投票
3 回答
5134 浏览

php - In php, I want to download an s3 file to the browser without storing it on my server

I've got files on Amazon's S3. They are named with a unique ID so there are no duplicates. I am accessing them using an authorized URL. I need to be able to pass them through to the browser, but I need to rename them. Right now I'm using fopen, but it is downloading the file to my server before serving the file to the browser. How can I have the files 'pass through' my server to the browser? Or how do I buffer the download - downloading a small chunk to my server and pass that to the browser while downloading the next chunk?

Also - I would really like to use CloudFront but they don't offer authenticated URLs. I believe I can use CURL to send credentials for the request - can I do this sort of 'pass through' file serving with CURL?

Thanks!