我现在遇到一个问题,希望各位能帮忙,谢谢!:
我写了这段程序procedure TForm1.Button1Click(Sender: TObject);
begin
  ReadMW20To24(20);                                 /1
  Application.ProcessMessages;
  Edit1.Text:=IntToStr(NowPosition );              /3               
  ReadMW20To24(21);                                /4
  Application.ProcessMessages;
  Edit2.Text:=IntToStr(NowPosition );              /6
end;
 
procedure TForm1.ReadMW20To24(mw: Integer);
var CountCheck:Integer;
begin
  pReadMW20To24[0]:=$01;
  pReadMW20To24[1]:=$03;
  pReadMW20To24[2]:=$00;
  pReadMW20To24[3]:=mw;
  pReadMW20To24[4]:=$00;
  pReadMW20To24[5]:=$01;
  pReadMW20To24[6]:=CRC16(pReadMW20To24,6)div 256;
  pReadMW20To24[7]:=CRC16(pReadMW20To24,6)mod 256;
  pReadMW20To24Var:=VarArrayCreate([0,7],varByte);
  for CountCheck:=0 to 7 do
    pReadMW20To24Var[CountCheck]:=pReadMW20To24[CountCheck];
  Comm.InBufferCount:=0;
  4Var;
end;
 
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
    case Comm.CommEvent of
      ComEvReceive:
        begin
           length:=Comm.InBufferCount ;
           if length=7 then begin file://读PLC得到的回复,回来7个数字
             ReceiveDataVar:=VarArrayCreate([0,6],varByte);
             ReceiveDataVar:= Comm.input;
             Comm.InBufferCount:=0;
             for  j:=0 to 6 do
               ReceiveData[j]:=ReceiveDataVar[j];
             NowPosition:=ReceiveData[3]*256+ReceiveData[4];                      /2     /5
          end;// end if 是读数据
        end;
    end;
end;
本来的意思是计算机发送读取COMM口要求,然后将读到的数据NowPosition显示在Edit1和Edit2上,也就是按照1-2-3-4-5的顺序执行,但是实际操作时,计算机没有等到触发OnCOMM程序就直接做了第三步,也就是单步执行的时候出现了1-3-4-6的情况,我要怎么做才能等待OnCOMM程序程序触发后才执行下面的程序,我从晚上得知Application.ProcessMessages;能够空出cpu来执行,但是在我这里好像没有效用
如果我
  Application.ProcessMessages;
  Edit1.Text:=IntToStr(NowPosition );              /3               
  ReadMW20To24(21);                                /4
  Application.ProcessMessages;
  Edit2.Text:=IntToStr(NowPosition ); 
这段语句没有写,就能触发OnCOMM程序,谁知道是怎么回事吗?

解决方案 »

  1.   

    Application.ProcessMessages;是让程序可以接受消息,不会象死掉一样
      

  2.   

    我查了一下资料,你是否应在执行完1和4后等待一下,用waitforsingleobject(),下面给你一个例子,用于外部程序的,希望对楼主有帮助(注这个函数也可用于串口通信时)执行一个外部程序并等待它的完成    
      Function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD; 
    varStartupInfo:TStartupInfo;ProcessInfo:TProcessInformation;beginFillChar(StartupInfo,SizeOf(StartupInfo),#0);StartupInfo.cb:=SizeOf(StartupInfo);StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;StartupInfo.wShowWindow:=visiable;if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) thenresult:=0elsebeginwaitforsingleobject(processinfo.hProcess,INFINITE);GetExitCodeProcess(ProcessInfo.hProcess,Result);end;end;