我有一个程序,我通过NI(NI)的ADC系统记录数据。
设备缓冲信息一段时间,然后程序在某个时刻收集缓冲区数据。如果程序收集的数据大于缓冲区,则缓冲区必须释放,而我的程序不接收数据,这将导致NI库抛出一个异常,说明所请求的数据不再可用,因为它已丢失。 / p>
由于我的程序是一个命令提示程序,如果用户单击并按住滚动条,程序会暂停,这可能会发生此问题。
如何在不增加缓冲区大小的情况下解决此问题?我可以在Windows中禁用此保持功能吗?
感谢。
答案 0 :(得分:4)
仅阻止尝试输出到控制台的线程。将它作为一个单独的线程,你的问题就会消失。
当然,你需要缓冲输出,并在缓冲区溢出时做一些合理的事情。
作为参考,这里是我用来测试它的简单代码,你会注意到,即使按住滚动条,计数器也会继续增加:
#include <Windows.h>
#include <stdio.h>
volatile int n = 0;
DWORD WINAPI my_thread(LPVOID parameter)
{
for (;;)
{
n = n + 1;
Sleep(800);
}
}
int main(int argc, char ** argv)
{
if (!CreateThread(NULL, 0, my_thread, NULL, 0, NULL))
{
printf("Error %u from CreateThread\n", GetLastError());
return 0;
}
for (;;)
{
printf("Hello! We're at %u\n", n);
Sleep(1000);
}
return 0;
}
答案 1 :(得分:3)
虽然可能有办法绕过每个单独的问题,你可以设想输出[包括例如通过网络在有时很慢的输出链接上运行它,或者某些这样的],我认为正确的做法是断开输出与收集数据的连接。通过添加一个收集数据的单独线程,并将主线程显示到命令提示符窗口,这应该不难。这样,无论Windows输出的“输出被阻止”的哪种变化,它都会起作用 - 至少在你用尽RAM之前,但是这表明你的程序决定做某事[例如丢掉一些数据或某些数据]。
这通常是问题“我需要收集什么,我还需要允许用户查看数据,但我不希望这两者互相干扰”得到解决。
答案 2 :(得分:2)
首先使用GetConsoleWindow winapi function并获取控制台的HWND。 现在我建议两种方法来做到这一点,
方法I 通过创建自己的WindowProcedure对窗口进行子类化。 (get help from here) 现在你已经将它子类化了,你可以拦截WM_VSCROLL和WM_HSCROLL消息并对你的代码做自己的补救。
方法II 使用SetWindowPos之类的函数更改窗口的大小,以便不需要滚动条。 或更改console screen buffer的大小,以便不需要滚动条。
方法I对应用程序有很多控制权,但它比方法II有点复杂,非常简单。
如果您要禁止用户调整控制台窗口的大小,只需从控制台窗口的 WindowStyle 中删除WS_THICKFRAME
即可。
答案 3 :(得分:0)
我处于类似情况,发现这种阻止行为可能是由命令提示符的快速编辑“功能”引起的。 question对此进行了解释,答案显示了如何禁用它。希望能有所帮助,即使几年后:)