我现在遇到一个问题,希望各位能帮忙,谢谢!:
我写了这段程序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程序,谁知道是怎么回事吗?
我写了这段程序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程序,谁知道是怎么回事吗?
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;