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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: TThread - Sleep

  Alt 9. Jul 2010, 08: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
 
#2

AW: TThread - Sleep

  Alt 9. Jul 2010, 08: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
 
#3

AW: TThread - Sleep

  Alt 9. Jul 2010, 08: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
 
#4

AW: TThread - Sleep

  Alt 9. Jul 2010, 10: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
Benutzerbild von ChrisE
ChrisE

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

AW: TThread - Sleep

  Alt 9. Jul 2010, 10:23
Delphi-Quellcode:
TMyThreadContainer = class
private
  FCSResults: TCriticalSection;
  FResults: TStringList;
  FInfoHandle: HWnd;
  FInfoMessage: Cardinal;
  //...
public
  procedure Start(AInfoFormHandle: Handle; AMessage: Cardinal);
  procedure AddResult(AString: string);
  function HasMoreResults: Boolean;
  function GetResult: string;
  //...
end;

//...

procedure TMyThreadContainer.Start(AInfoFormHandle: HWnd; AMessage: Cardinal);
begin
  // ...
  FInfoHandle := AInfoFormHandle;
  FInfoMessage := AMessage;
  // ...
end;

procedure TMyThreadContainer.AddResult(AString: string);
begin
  FCSResults.Enter;
  try
    FResults.Add(AString); // immer oben drauf
  finally
    FResults.Leave;
  end;
  // Sperrung der Section so kurz wie möglich halten
  PostMessage(FInfoHandle, FInfoMessage, 0, 0);
end;

procedure TMyThreadContainer.HasMoreResults: Boolean;
begin
  FCSResults.Enter;
  try
    result := FResults.Count > 0;
  finally
    FResults.Leave;
  end;
end;

procedure TMyThreadContainer.GetResult: string;
begin
  FCSResults.Enter;
  try
    result := FResults[0];
    // UPS -> hier noch löschen :-)
    FResults.Delete(0);
  finally
    FResults.Leave;
  end;
end;

//....
const WM_NEW_RESULTS = WM_USER +1;


type
TForm1 = class(TForm)
  procedure WMNewResults(msg: TMessage);message WM_NEW_RESULTS;
//...
end;

procedure TForm1.DoStart;
begin
  // ....
  MyThreadContainer.Start(Self.Handle, WM_NEW_RESULTS);

  // ....
end;

procedure TForm1.WMNewResults(msg: TMesssage);
begin
  Listbox1.Items.BeginUpdate;
  try
    while MyThreadContainer.HasMoreResults do
    begin
      ListBox1.Items.Add(MyThreadContainer.GetResult);
    end;
  finally
    ListBox1.Items.EndUpdate;
  end;
end;
Ungetestet

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

Geändert von ChrisE ( 9. Jul 2010 um 10:31 Uhr) Grund: FResults.Delete(0) vergessen :-(
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

AW: TThread - Sleep

  Alt 9. Jul 2010, 10:34
Moin,
Die CriticalSection ist klar, jedoch habe ich jetzt noch nicht verstanden wie ich die Daten dann aufs Formular bringe. PostMessage ?! [...]
Du sendest einfach eine Nachricht an das Hauptformular und damit an den Hauptthread.

Ich selber mache da auch gerne ein synchronisiertes Event draus.

[...]PS: Mal was anderes, warum wird häufig ein führendes F vor Variablen etc genutzt ?
Bei private Attributen eines Objekts verwendet man gerne als Präfix das große F, damit man mit einer gleich lautenden Property (außer dem F) zugreifen kann (z.B.). Das F steht dabei für Field.

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
 
#7

AW: TThread - Sleep

  Alt 10. Jul 2010, 14:51
*PUSH*

Hat jemand schon eine Lösung warum "Sleep" und "Synchronize" nicht gut zusammen spielen ?


bYe
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

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

AW: TThread - Sleep

  Alt 12. Jul 2010, 07:04
Hallo JoltinJoe,

du hast ja schon aufgezeigt bekommen, wie du Dein Problem lösen kannst. Bisher habe ich keine Probleme mit Synchronize und Sleep gehabt, wenn ich sie richtig "miteinander" verwendet habe.

Du könntest ja einfach mal ein Demoprojekt zusammenbauen, bei dem Du zeigst, dass dieses Problem in Deiner Verwendung auftritt. Dann könnte man es genauer heraus bekommen.

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
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#9

AW: TThread - Sleep

  Alt 16. Dez 2010, 21:32
Hallo zusammen

Tut mir Leid, dass ich diesen alten Thread nochmal ausgrabe, aber ich abe ein ähnliches Problem mit Theads und sleep.
Ich habe versucht den Beispielcode der hier geschrieben wurde umzusetzen, jedoch ohne Erfolg.

Ich möchte lediglich einen neuen Thread aufmachen, dort 5 sek warten und danach einige prozeduren ausführen.
Könnte mir jemand erklären wie das geht?

Ich werde aus diesem ganzen CriticalSection,highcontainer etc. nich wirklich schlau

Hat evtl. jemand eine fertige klasse für mich?
Was genau muss ich bei MyThread.execute ändern?

Wäre super, wenn jemand mir weiterhelfen könnte

MfG
w4rheart
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz