MFC中CloseHandle()卡住

MFC中调用CloseHandle()关闭串口句柄时,卡在这里有30s;
debug模式下的报错信息:

10:17:35:406   before close com:000003F0
The thread 0x3D4 has exited with code 0 (0x0).
10:18: 5:408   after close com:000003F0

关闭串口句柄的代码:

        dbg("before close com:%p\r\n",hd);
        if(hd) CloseHandle(hd);
        dbg("after close com:%p\r\n",hd);

代码中没有创建线程,直接用CreateFile打开的串口,为啥会等待这个线程结束才关闭串口呢?
打开串口的代码:

HANDLE com_port_open(const char *com, int baud_rate, int ByteSize, int Parity, int StopBits)
{
        char use_com[64] = {0};
        if(strlen(com) > 4) sprintf(use_com,"\\\\.\\%s",com);
        else memcpy(use_com,com,strlen(com));

    HANDLE hCom = CreateFile(use_com,           // 串口名称或设备路径
              GENERIC_READ|GENERIC_WRITE,       // 读写方式
              0,                    // 共享方式:独占
              NULL,                 // 默认的安全描述符
              OPEN_EXISTING,            // 创建方式
              0,                    // 不需设置文件属性
              NULL                  // 不需参照模板文件
              );
    if(hCom == INVALID_HANDLE_VALUE) return(NULL);      // 打开串口失败

    DCB dcb;                        // 串口控制块
    COMMTIMEOUTS timeouts = {               // 串口超时控制参数
        0,                      // 读字符间隔超时时间:不启用
        1,                      // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
        CUART_RX_TIMEOUT,               // 基本的(额外的)读超时时间: 200 ms
        2,                      // 写操作时每字符的时间: 2 ms (n个字符总共为n ms)
        2000                        // 基本的(额外的)写超时时间: 2000ms
    };

    GetCommState(hCom,&dcb);                // 取DCB

    dcb.fOutxCtsFlow = FALSE;               // 禁止硬流控, 因为本系统不需要 
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fDtrControl = DTR_CONTROL_DISABLE; 
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = false;

    dcb.BaudRate = baud_rate;
    dcb.ByteSize = ByteSize;
    dcb.Parity = Parity;
    dcb.StopBits = StopBits;
    dcb.fBinary = true; 
    SetCommState(hCom,&dcb);                // 设置DCB

    SetupComm(hCom,64*4096,64*4096);            // 设置输入输出缓冲区大小
    SetCommTimeouts(hCom,&timeouts);            // 设置超时

    DWORD dwError;                      // ie:CE_RXOVER
    COMSTAT cs;
    ClearCommError(hCom,&dwError,&cs);
    PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
    return(hCom);
}

有大神清楚如何缩短这30s不?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问