Удержание полосы прокрутки заставляет командную строку останавливаться в Windows

У меня есть программа, в которой я записываю данные через систему ADC от National Instruments (NI).

Устройство некоторое время буферизует информацию, а затем программа собирает данные буфера в какой-то момент. Если программа собирает данные больше, чем буфер, то буфер должен был бы освободиться без получения моей программой данных, что приведет к тому, что библиотека NI сгенерирует исключение, сообщающее, что запрошенные данные больше не доступны, так как они были потеряны.

Поскольку моя программа является программой командной строки, если пользователь нажимает и удерживает полосу прокрутки, программа приостанавливается, что может привести к возникновению этой проблемы.

Как я могу преодолеть эту проблему, не увеличивая размер буфера? Могу ли я отключить эту вещь в Windows?

Благодарю.

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;
}
4

Другие решения

Хотя могут быть способы обойти каждую отдельную проблему, которую вы, возможно, можете себе представить с помощью выходных данных (включая, например, запуск по сети по иногда медленному выходному каналу или что-то подобное), я думаю, что правильное решение — отключить выход. от вашего сбора данных. Это не должно быть сложно сделать, добавив отдельный поток, который собирает данные, и отобразив основной поток в окне командной строки. Таким образом, независимо от того, какой вариант «выхода заблокирован» Windows выбрасывает на вас, он будет работать — по крайней мере, до тех пор, пока у вас не закончится ОЗУ, но это означает, что решение ВАШЕЙ программы сделать что-либо [например, выбросить некоторые данные или что-то подобное.

Так обычно решается проблема «мне нужно что-то собрать, и мне также нужно разрешить пользователям просматривать данные, но я не хочу, чтобы они мешали друг другу».

3

Сначала используйте GetConsoleWindow WinAPI функция и получите HWND вашей консоли.
Теперь я предлагаю два способа сделать это,

Способ I
Подкласс окна, создавая свой собственный WindowProcedure. (получить помощь отсюда)
Теперь, когда вы подклассировали его, вы можете перехватить WM_VSCROLL и сообщения WM_HSCROLL и внесите свои коррективы в свой код.

Способ II
Измените размер окна, используя такую ​​функцию, как SetWindowPos так что полосы прокрутки не нужны.
или измените размер буфер экрана консоли так что полосы прокрутки не нужны.

Метод I имеет большой контроль над приложением, но он немного сложнее, чем метод II, который очень прост.
Если вы хотите запретить пользователю изменять размер окна консоли, просто удалите WS_THICKFRAME от WindowStyle окна консоли.

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector