现有一个工程 程序启动开启两个线程 一个接收线程(rev_thread),一个接收线程(rev_thread),接收线程(rev_thread)一直工作,发送线程(send_thread)通过 按下触摸屏(OnLButtonDown)触发,每个单独线程工作时,都需要readfile、writefile。触摸屏按下时,先挂起 (SuspendThread)接收线程(rev_thread),再通过标志位(flag) 触发 发送线程(send_thread),待发送线程(send_thread)结束后,恢复(ResumeThread)接收线程(rev_thread),让接收线程(rev_thread)开始工作。经过测试,程序启动后,按下触摸屏,断点测试,程序会卡在发送线程(rev_thread)中的readfile()函数 7-10s。单独建工程测试 接收线程(rev_thread)、接收线程(rev_thread),都能正常工作,不会卡在readfile()函数这里。

附上部分代码:

超时设置:
  COMMTIMEOUTS CommTimeOuts;  
HANDLE Revhdser = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(Revhdser == INVALID_HANDLE_VALUE)
{
  MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
  return FALSE;
}
DCB  dcb;
GetCommState(Revhdser, &dcb);      /* 读取串口的DCB */
dcb.BaudRate = 115200;   
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fParity = FALSE;        /* 禁止奇偶校验 */
dcb.fBinary = TRUE;
dcb.fDtrControl = 0;        /* 禁止流量控制 */
dcb.fRtsControl = 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;
//设置状态参数
SetCommMask(Revhdser, EV_RXCHAR);     /* 串口事件:接收到一个字符 */
SetupComm(Revhdser, 1024, 1024);     /* 设置接收与发送的缓冲区大小 */
GetCommTimeouts(Revhdser, &CommTimeOuts);  
CommTimeOuts.ReadIntervalTimeout = 10;   /* 接收字符间最大时间间隔 */
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;  
CommTimeOuts.ReadTotalTimeoutConstant = 0;  /* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(Revhdser, &CommTimeOuts);

发送线程 部分代码:
   SuspendThread(hrevThread);//挂起接收线程
   main_tx( );//发送函数   
    ResumeThread(hrevThread); //恢复接收线程