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