1

現在、フレーム 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;
4

2 に答える 2