現在、フレーム 1 はループ (Serial Comport からのデータを探している) にあり、別のユニットで文字列変数 A に書き込みます。Frame1 は、別のブール変数 B が true になるまでループします。これは、Frame2 がそのルーチンを処理したことを意味します。フレーム 2 はタイマーを使用して変数 A の変更をチェックし、変数が変更されたときにプロシージャを実行し、ブール変数 B を true に設定します。フレーム 1 でループし、変数 B が true になることを確認すると、おそらくメッセージ キューが空にならないため、フレーム 2 でタイマーを起動できなくなります。
今のところ、私は睡眠(xxx)でしか自分を助けることができません。しかし、私はより良いパフォーマンスが欲しいです。
助けてください :)
ありがとうございました
Edit1: トピック ヘッダーのポイントに言及するのを忘れていました。タイマーをなくしてframe2の手続きを直接呼びたい。
Edit2: コード:
フレーム 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;