我正在编写一个小测试应用程序来测试通信接口。通信接口是用C++(一个DLL)和使用C#的测试应用程序编写的。通信接口进而与使用Windows消息传输和接收数据的低级硬件堆栈进行通信。为了实现这一点,通信接口DLL创建一个不可见的子窗口,其父窗口是C#测试应用程序窗口。与硬件通话的顺序如下:阻塞函数调用
初始化通信库。这一步需要传递给低级堆栈的主窗口句柄和应用程序实例以进行Windows消息传递。
连接时使用的装置地址
读/写
关闭
取消初始化通信库。
现在,在第二步中,DLL创建一个不可见的窗口与低级硬件堆栈进行通信。由于第二步是阻塞呼叫,因此我希望我的用户界面在这段时间内有所反应,以防连接需要很长时间。因此,我尝试使用线程或BeginInvoke调用进行异步连接。但是我观察到建立连接后,只要子窗口存在,应用程序窗口就会挂起。子窗口似乎阻止所有传入主窗口的消息。这似乎是因为子窗口是在另一个线程中创建的。
但我不想要连接在主线程中,因为它挂起了用户界面。
我会欢迎任何想法如何避免这个问题?提前致谢。
-Harish
只是好奇为什么2是阻止呼叫?您的代码是否继续轮询以查看设备是否已连接?作为一种解决方案,为什么要创建子窗口 - 创建顶级消息窗口(http://msdn.microsoft.com/zh-cn/library/ms632599(VS.85).aspx#message_only)。 – VinayC 2010-10-25 13:31:36
嗨维纳,我不创建子窗口。我只使用开发者已经这样做的DLL。我想内部的DLL有一个超时来知道连接是否完成。这是一个非常大的超时,因此对我的应用程序有阻塞作用。问题的一部分也是因为通信堆栈提供商 – HIyer 2010-10-25 13:37:48