AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread - Sleep

Ein Thema von JoltinJoe · begonnen am 7. Jul 2010 · letzter Beitrag vom 17. Dez 2010
Antwort Antwort
Seite 2 von 3     12 3      
JoltinJoe

Registriert seit: 26. Jun 2010
29 Beiträge
 
Delphi 7 Enterprise
 
#11

AW: TThread - Sleep

  Alt 8. Jul 2010, 18:20
Das hat sich ein Fehler beim kopieren eingeschlichen... "CheckCondition" kann außer Acht gelassen werden, habe es auch im Vor-Thread entfernt...

Nach dem Start der Threads schläft das ganze Programm sofort und danach führen alle Threads "MEINE_ANDEREN_PROCEDUREN" aus.



Edit:

Wenn ich die 100 Aufgaben anstatt auf 100 Threads nur auf 1 Thread lege dann klappt es. 50 werden ausgeführt, dann wird geschlafen und dann kommen die anderen 50.

Wenn ich die 100 Aufgaben auf 100 Threads lege dann wird erst geschlafen und dann werden alle 100 Threads mit einem mal abgearbeitet.

Geändert von JoltinJoe ( 8. Jul 2010 um 19:23 Uhr)
  Mit Zitat antworten Zitat
JoltinJoe

Registriert seit: 26. Jun 2010
29 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: TThread - Sleep

  Alt 8. Jul 2010, 20:00
Delphi-Quellcode:
procedure TMyOwnThread.HighCondition;
begin
  FetchedCount:=FetchedCount+1;
end;

procedure TMyOwnThread.ResetCondition;
begin
  FetchedCount:=0;
end;

procedure TMyOwnThread.WriteResults;
begin
  Form1.Memo1.Lines.Add('blaa');
end;

procedure TMyOwnThread.Execute;
begin
  while not Terminated do
  begin
    Synchronize(HighCondition);
    if FetchedCount>50 then
    begin
      Sleep(10000);
      Synchronize(ResetCondition);
    end;
    Synchronize(WriteResults);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Thread: TMyOwnThread;
  ThreadCount: Integer;
begin
  ThreadCount:=100;
  for i:=0 to ThreadCount-1 do
    begin
      Thread:=TMyOwnThread.Create(True);
      Thread.FreeOnTerminate := True;
      Thread.Resume;
    end;
end;

Habe hier nochmal den kompletten Code zur Veranschaulichung gekürzt ..

Geändert von mkinzler ( 8. Jul 2010 um 20:02 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#13

AW: TThread - Sleep

  Alt 8. Jul 2010, 21:36
Moin,
Und so funktioniert er nicht? Weil ich kann da keine Probleme erkennen. Wobei natürlich 100 Threads via Sync schon heftig ist.

Wäre da nicht eventuell eine Delphi-Referenz durchsuchenTCriticalSection was?

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
JoltinJoe

Registriert seit: 26. Jun 2010
29 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: TThread - Sleep

  Alt 9. Jul 2010, 07:00
Die 100 habe ich frei aus der Luft gegriffen, wieviele es werden ist noch nicht bekannt, denke mal um die 20 Threads.

Ich seh da auch kein Problem Aber wie gesagt, es funktioniert nicht... (Habs auch schon mit 3, 10, 20 Threads versucht)
  Mit Zitat antworten Zitat
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
JoltinJoe

Registriert seit: 26. Jun 2010
29 Beiträge
 
Delphi 7 Enterprise
 
#16

AW: TThread - Sleep

  Alt 9. Jul 2010, 08:46
Hm das sieht schonmal interessant aus aber dann stellt sich trotzdem die Frage warum Sleep unter den Umständen nicht funktioniert. Ohne Sleep werden die Aufgaben parallel und ohne Probleme ausgeführt. Also sollte Synchronize eigentlich die richtige Wahl gewesen sein ?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: TThread - Sleep

  Alt 9. Jul 2010, 09:50
Nein, Synchronize bremst einen Thread immer aus.
Eine CriticalSection ist da wesentlich besser, vor allem weil beim Setzen eines Wertes ein Synchronize völlig überflüssig ist.
Wenn du mit deinem Fahrrad fährst, hälst du auch nicht an, nur um dich am Kopf zu kratzen.

Ich versuche immer ein Synchronize zu vermeiden und arbeite mit CriticalSections und PostMessage oder Polling. Dadurch bleibt der Thread autonom und performant.

Und ein Sleep in einem Thread geht dann auch
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
JoltinJoe

Registriert seit: 26. Jun 2010
29 Beiträge
 
Delphi 7 Enterprise
 
#18

AW: TThread - Sleep

  Alt 9. Jul 2010, 09:53
Gut dann werd ich das aufjedenfall probieren ! Bleibt trotzdem die Frage warum Sleep mit Synchronize nicht funktionert
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

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

AW: TThread - Sleep

  Alt 9. Jul 2010, 09:59
Hallo JoltinJoe,

wie Sir Rufo schon gesagt hat ist da ein großer Unterschied. Synchronize sorgt quasi dafür, dass die Methode durch den Haupt-Thread ausgeführt wird. Eine CriticalSection sorgt nur dafür, dass dieser Bereich nur von einem Thread gleichzeitig "betreten" wird.

Aber du hast recht, mir will es gerade auch noch nicht in den Kopf, warum Sleep in der execute-Methode nicht funktioniert bzw. den Haupt-Thread zum Stillstand bringt.

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
JoltinJoe

Registriert seit: 26. Jun 2010
29 Beiträge
 
Delphi 7 Enterprise
 
#20

AW: TThread - Sleep

  Alt 9. Jul 2010, 11:04
Die CriticalSection ist klar, jedoch habe ich jetzt noch nicht verstanden wie ich die Daten dann aufs Formular bringe. PostMessage ?!


PS: Mal was anderes, warum wird häufig ein führendes F vor Variablen etc genutzt ?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz