TO:zhangkan
谢谢了!
我的程序本意是校正单片机时间。客户点击“时间校正”按钮,然后返回校正成功的数据。流程大概是:先发送一个时间矫正的指令给单片机,然后读单片机返回串口的数据,最后将数据显示在EDIT控件中。(都是在JUDGETIME函数中)
本来可以使用单线程来做这个程序,但是可能是由于我的程序有问题,没有什么例子,所以我使用多线程。
代码大概如下:
Function JudgeTime():String;
begin
SendData('Com1');
//发送读时间指令给单片机
ReadData('Com1');
//读取单片机发送到串口的数据
Sleep(5000);
//延时5秒等待消息处理函数读完串口数据。
.......
.......
Result:=读出的串口数据。
end;
ReadData()创建一个监视线程ComWatch监视串口。等待数据。
procedure CommWatch(Ptr
ointer);Stdcall;
begin
.......
While (Receive)do
begin
dwEvtMask:=0;
If Not WaitCommEvent(Hcom,DwEvtMask,@Os) then
begin
if Error_IO_PENDING=GetLastError then
GetOverLappedResult(Hcom,Os,DwTranser,True);
//问题出在这,执行这句话后就跳到主函数中去了。等主函数
执行完后才执行消息处理函数。
end;
if (DwEvtMask and Ev_Rxchar)=Ev_RxChar then
begin
WaitForSingleObject(Post_Event,Infinite);
resetEvent(Post_Event);
Ok:=PostMessage(FrmScom.Handle,Wm_Commnotify,Hcom,0);
//消息处理函数省略了。
if NOt Ok then
begin
ShowMessage('Error');
Exit;
end;
end;
end;
end;
我昨天在JUDGETIME()函数中使用InitializeCriticalSection
在监视程序中使用DeleteCriticalSection和EnterCriticalSection;
但是主线程没有停止,执行了几句话后才执行分线程(监视程序)(并不是主执行完后才执行分线程)。今天我使用SLEEP()后主线程停止了,但是分线程执行到我上面所说的那句话后有回到主线程了。
我的Email是Cslegend@etang.com
谢谢了。