Я пишу небольшое тестовое приложение для тестирования интерфейса связи. Интерфейс связи написан на C++ (DLL) и тестовом приложении с использованием C#. Интерфейс связи в свою очередь говорит о аппаратном стеке низкого уровня, который использует сообщения Windows для передачи и приема данных. Чтобы достичь этого, DLL-интерфейс коммутации создает невидимое дочернее окно, чей родитель является окном приложения C#. Последовательность, чтобы поговорить с оборудованием, следующая:Вызов функции блокировки
Инициализировать библиотеку связи. Этот шаг ожидает, что дескриптор главного окна и экземпляр приложения передается в стек низкого уровня для обмена сообщениями Windows.
Connect, используя адрес устройства
Чтение/запись
Закрыть
деинициализации библиотеке связи.
Теперь, на втором этапе, DLL создает невидимое окно для связи с аппаратным стеклом низкого уровня. Поскольку второй шаг является блокирующим вызовом, я хочу, чтобы мой пользовательский интерфейс был отзывчивым в течение этого времени в случае, если потребуется много времени для подключения. Поэтому я пытаюсь подключиться асинхронно с помощью потока или вызова BeginInvoke. Но я заметил, что после установления соединения окно приложения зависает, пока существует дочернее окно. Окно дочернего окна блокирует все входящие сообщения в главном окне. Кажется, это связано с тем, что дочернее окно создается в другом потоке.
Но я не хочу, чтобы соединение было в основном потоке, поскольку он висит в пользовательском интерфейсе.
Я бы приветствовал любые идеи о том, как избежать этой проблемы? Заранее спасибо.
-Harish
Просто любопытно, почему 2 является блокирующим звонком? Ваш код продолжает опрос, чтобы узнать, подключено ли устройство? В качестве решения, почему вы создаете дочернее окно - создайте окно только для сообщений верхнего уровня (http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx#message_only). – VinayC
Hi Vinay, я не создаю дочернее окно. Я использую только DLL, разработчик которой сделал это именно так. Я полагаю, что внутри DLL имеет тайм-аут, чтобы узнать, было ли соединение выполнено. Это очень большой тайм-аут и, таким образом, оказывает блокирующее влияние на мое приложение. Часть проблемы также связана с провайдером стека связи – HIyer