У меня есть приложение Qt (Qt 4.8.1 ), которое выполняет некоторые задачи последовательного порта Windows. Я обнаружил, что иногда вызов CreateFileA, который я делаю для открытия последовательного порта, занимает до 30 секунд! Очевидно, я делаю что-то, чтобы вызвать это странное поведение, и я хочу знать, что я могу сделать, чтобы вызвать это.
m_portHand = CreateFileA( portDevice.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // default security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL ); // hTemplate must be NULL for comm devices
m _portHand — это HANDLE, а portDevice — стандартная строка ::и содержит «COM5».
Этот вызов запускается нажатием кнопки в основном потоке моего приложения. В то время, когда это происходит, приложение имеет не более одного другого потока, но эти потоки (, если таковые имеются ), простаивают.
Единственная важная вещь, происходящая в системе, — это виртуальная машина под управлением Linux, но система представляет собой четырехъядерный -процессор, и 3 из ядер так же близки к бездействию, как вы видите на компьютере с Windows, и только одно из них делает что-либо с процессором. ВМ.
Последовательные порты находятся на 8-портовой последовательной USB-коробке, может ли это быть связано?
Это как-то связано с Overlapped IO?
В ответ на комментарии:
Порт не открыт другим приложением. Порт был ранее открыт предыдущим вызовом этого приложения, которое было правильно закрыто, а порт закрылся с помощью «CloseHandle».
Я не смог определить какой-либо корреляции между тем, что это занимает 30 секунд, и не -иногда я запускаю приложение, нажимаю кнопку, и мы начинаем гонки, иногда это занимает до 30 секунд.
Виртуальная машина перехватывает некоторые другие USB-устройства на том же серийном блоке.
За исключением последовательного блока (с виртуальной машиной, опрашивающей 4 порта в поисках устройств ), шина USB не загружена.
Я не видел поведения в других приложениях.Я попробую переключиться на встроенный -порт (COM1 на материнской плате ), чтобы посмотреть, повлияет ли это.
Мне только что пришла в голову мысль :может форма адресации портов как-то связана с этим? Другие подобные приложения, над которыми я работаю, используют библиотеку qestserialport, которая открывает порты с использованием нотации '\\.\COM #'. Есть ли способ, которым используемая нотация может повлиять на время?
На последовательном USB-устройстве написано «VScom», и обычно оно открывается сразу (< 10 миллисекунд для вызова CreateFile ). Это просто случайная проблема, когда что-то забивается, и у меня есть другие программы, которые НИКОГДА не проявляют такого поведения.
Устройство, с которым я говорю, — это медицинский монитор, использующий протокол IEEE 11073. Во всяком случае, у меня подключение к устройству работает нормально, проблема заключается ТОЛЬКО в том, что последовательный порт открыт. Может ли иметь к этому какое-то отношение состояние серийных линий управления в открытое время? Устройство на другом конце опрашивает свои порты в поисках разных вещей, с которыми можно поговорить, поэтому я понятия не имею, как выглядят последовательные линии в тот момент, когда что-то идет не так.