现有一个工程 程序启动开启两个线程 一个接收线程(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); //恢复接收线程