C Win32中的线程与串行通信

C Win32中的线程与串行通信,c,multithreading,winapi,serial-port,C,Multithreading,Winapi,Serial Port,我有一个Windows C程序,它使用Win32 API,有一个主线程和另一个线程(名为ThreadRx),从串行端口(虚拟COM端口,USB)接收数据。 串行端口以“重叠”模式处理。 ThreadRx的核心是一个while循环: while(is_ThreadRx_Enabled) { //issue a read operation //wait for the event "read completed" //feed a shared variable

我有一个Windows C程序,它使用Win32 API,有一个主线程和另一个线程(名为ThreadRx),从串行端口(虚拟COM端口,USB)接收数据。 串行端口以“重叠”模式处理。 ThreadRx的核心是一个while循环:

while(is_ThreadRx_Enabled)
{
      //issue a read operation
      //wait for the event "read completed"
      //feed a shared variable
      //other things....
}
ExitThread(0);
当我想关闭程序时,主线程会按以下方式禁用ThreadRx:

is_ThreadRx_Enabled = FALSE; //block rx thread loop
waitFSOretval = WaitForSingleObject(hThreadRx, 2000); //wait max 2s 
switch (waitFSOretval)
{
case WAIT_OBJECT_0:
    break; //OK, thread terminated
default: //in any other case (e.g., timeout) force thread termination
    TerminateThread(hThreadRx, 1);
    break;
}
retval = CloseHandle(hThreadRx);
现在,如果连接到串行端口的变送器不再发送数据,读取操作将被阻止,因此rxThread终止将被强制。在串行端口上执行以下任何操作都会导致错误(如果我尝试刷新串行端口,则会出现蓝屏!!!) 处理这种情况的正确方法是什么? 是否有类似“中止”的函数来终止已发出的读取操作? 非常感谢!
Alessio

通常在关闭文件的最后一个句柄时—所有io操作都会中止。也存在
CancelIo[Ex]
。另外,我也在您的位置上,不创建专用线程,而是通过
BindIoCompletionCallback
将串行端口绑定到回调。同样,最好的方法是取消io-关闭文件的所有句柄并使用专用线程,该线程基于您的注释在读取完成时等待-发出读取操作..等待事件“读取完成-无意义异步(“重叠”)模式-您自己实现同步模式真的-为什么要自己原地等待-让这个系统自动运行,使用同步句柄?如果您真的想要异步处理-您不需要在io操作完成后等待,而是使用回调/事件驱动样式/而不需要使用专用线程如果您使用“重叠模式”则不应阻止读取。请发布被阻止线程的堆栈跟踪,以获得最佳建议。