Thema: Delphi TThread - Sleep

Einzelnen Beitrag anzeigen

Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: TThread - Sleep

  Alt 9. Jul 2010, 08:06
Hallo JoltinJoe,

also soweit ich das in dem gekürzten Beispiel aus dem letzten Post mit den Sourcen sehen kann, macht jeder Thread hauptsächlich arbeit in der Zeit des MainThreads (Synchronize). Natürlich ist das ein gekürztes Beispiel, aber dieses Beispiel zeigt seht gut, dass Threads nicht immer die Lösung sind.

Ich würde versuchen, den Ansatz von xZise zu verfolgen und ResetCondition und HighCondition durch CriticalSections ab zu sichern. Das könnte etwas bringen.
Des weiteren würde ich versuchen WriteResults ebenso in einen Speicherbereich zu schreiben, denn du mit einer CriticalSection absichern kannst und dann deine Application z.B. per PostMessage darüber informierst, dass in dem Speicher etwas liegt, dass man auf der Oberfläche aus geben sollte.

Delphi-Quellcode:
TMyThreadContainer = class
private
  FCSFetchCount: TCriticalSection;
  FCSResults: TCriticalSection;
  FFetchCount: Integer;
public
  procedure Start(AInfoFrom: TForm);
  procedure HighCondition;
  procedure ResetCondition;
published
  property FetchCount: Integer read GetFetchCount write SetFetchCount;
end;

TMyOwnThread = class(TThread)
private
  FOwnerContainer: TMyThreadContainer;
//
public
  property OwnerContainer: TMyThreadContainer read FOwnerContainer write FOwnerContainer;

//...

function TMyThreadContainer.GetFetchCount: Integer;
begin
  FCSFetchcondition.Enter;
  try
    result:=FFetchCount;
  finally
    FCSFetchCount.Leave;
  end;
end;

procedure TMyThreadContainer.SetFetchCount(Value: Integer);
begin
  FCSFetchCount.Enter;
  try
    FFetchCount:=Value;
  finally
    FCSFetchCount.Leave;
  end;
end;

procedure TMyThreadContainer.HighCondition;
begin
  FetchCount := FetchCount +1;
end;

procedure TMyThreadContainer.ResetCondition;
begin
  FetchCount := 0;
end;

// ....

procedure TMyOwnThread.Execute;
begin
  while not Terminated do
  begin
    FOwnerContainer.HighCondition;
    if FOwnerContainer.FetchCount>50 then
    begin
      Sleep(10000);
      FOwnerContainer.ResetCondition;
    end;
    FOwnerContainer.WriteResults('bla bla');
  end;
end;
Wie gesagt, hier nur grob das Beispiel. Aber WriteResults kannst du noch absichern durch eine CS und dort halt das InfoForm per PostMessage informieren, dass es Ergebnisse zum abholen gibt. Der Container kann dann auch das Starten und ggf. auch das Abbrechen der Threads übernehmen. Das liegt dann an Dir

Greez, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat