У меня есть программа, в которой я записываю данные через систему ADC от National Instruments (NI).
Устройство некоторое время буферизует информацию, а затем программа собирает данные буфера в какой-то момент. Если программа собирает данные больше, чем буфер, то буфер должен был бы освободиться без получения моей программой данных, что приведет к тому, что библиотека NI сгенерирует исключение, сообщающее, что запрошенные данные больше не доступны, так как они были потеряны.
Поскольку моя программа является программой командной строки, если пользователь нажимает и удерживает полосу прокрутки, программа приостанавливается, что может привести к возникновению этой проблемы.
Как я могу преодолеть эту проблему, не увеличивая размер буфера? Могу ли я отключить эту вещь в Windows?
Благодарю.
Только поток, который пытается вывести на консоль, блокируется. Сделайте это отдельной веткой, и ваша проблема исчезнет.
Конечно, вам нужно будет буферизовать ваш вывод и сделать что-то разумное, если буфер переполнится.
Для справки, вот простой код, который я использовал для проверки этого, вы заметите, что счетчик продолжает увеличиваться даже при удерживании полосы прокрутки:
#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;
}
Хотя могут быть способы обойти каждую отдельную проблему, которую вы, возможно, можете себе представить с помощью выходных данных (включая, например, запуск по сети по иногда медленному выходному каналу или что-то подобное), я думаю, что правильное решение — отключить выход. от вашего сбора данных. Это не должно быть сложно сделать, добавив отдельный поток, который собирает данные, и отобразив основной поток в окне командной строки. Таким образом, независимо от того, какой вариант «выхода заблокирован» Windows выбрасывает на вас, он будет работать — по крайней мере, до тех пор, пока у вас не закончится ОЗУ, но это означает, что решение ВАШЕЙ программы сделать что-либо [например, выбросить некоторые данные или что-то подобное.
Так обычно решается проблема «мне нужно что-то собрать, и мне также нужно разрешить пользователям просматривать данные, но я не хочу, чтобы они мешали друг другу».
Сначала используйте GetConsoleWindow WinAPI функция и получите HWND вашей консоли.
Теперь я предлагаю два способа сделать это,
Способ I
Подкласс окна, создавая свой собственный WindowProcedure. (получить помощь отсюда)
Теперь, когда вы подклассировали его, вы можете перехватить WM_VSCROLL и сообщения WM_HSCROLL и внесите свои коррективы в свой код.
Способ II
Измените размер окна, используя такую функцию, как SetWindowPos так что полосы прокрутки не нужны.
или измените размер буфер экрана консоли так что полосы прокрутки не нужны.
Метод I имеет большой контроль над приложением, но он немного сложнее, чем метод II, который очень прост.
Если вы хотите запретить пользователю изменять размер окна консоли, просто удалите WS_THICKFRAME
от WindowStyle окна консоли.