现在,第 1 帧处于循环中(从 Serial Comport 中查找数据)并在单独的单元中写入字符串变量 A。然后 Frame1 循环,直到另一个布尔变量 B 为真,这意味着 Frame2 已经处理了它的例程。第 2 帧使用计时器检查变量 A 的变化,然后在变量发生变化时执行一个过程,并将布尔变量 B 设置为 true。在第 1 帧中循环并检查变量 B 是否为真会导致第 2 帧无法再触发它的计时器,因为消息队列可能不再为空。
现在我只能帮助自己睡觉(xxx)。但我想要更好的表现。
请帮忙 :)
谢谢
Edit1:我忘了从主题标题中提及这一点。我想摆脱计时器并直接调用frame2中的过程。
编辑2:代码:
框架1:
procedure TFrmSerial.TimerSerialTimer(Sender: TObject);
var
resultserial:string;
sl:Tstringlist;
iloop:integer;
begin
if CheckBox1.Checked then
begin
TimerSerialTimer.Enabled:=false;
readString(resultserial); //reads comport data to string
if (resultserial<>'') then
begin
sl:=TStringList.Create;
sl.Sorted:=true;
sl.Duplicates:=dupIgnore;
try
sl.Text:=resultserial;
unit3.DataProcessed:=true;
repeat
if (unit3.DataProcessed=true) then
begin
edit1.Text:=sl[0];
sl.Delete(0);
unit3.DataProcessed:=false;
end
else if (unit3.DataProcessed=false) then
begin
sleep(800);
unit3.DataProcessed:=true; //ugly workaround
end
else
begin
showmessage('undefined state');
end;
until (sl.Count=0);
finally
sl.Free;
end;
end;
TimerSerialTimer.Enabled:=true;
end;
end;
框架2:代码:
procedure TFrmProcessing.Timer1Timer(Sender: TObject);
begin
if self.Visible then
begin
timer1.enabled:=false;
if ProcessString<>ProcessStringBefore then
begin
ProcessStringBefore:=ProcessString;
if length(ProcessString)>2 then DoWork;
end;
unit3.DataProcessed:=true;
timer1.enabled:=true;
end;
end;