AGB  ·  Datenschutz  ·  Impressum  







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

Verständnisfrage zur Thread-Synchronisation

Ein Thema von EdAdvokat · begonnen am 10. Apr 2022 · letzter Beitrag vom 22. Apr 2022
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 12. Apr 2022, 16:54
Also dann eine übersichtliche Aufgabe:

Zähle in einem Thread Zähler1 von 0 - 1Mio.
Dann erhöhe einen zweiten Zähler Zähler2 um eins und setze Zähler1 auf null zurück.
Gib den aktuellen Stand von Zähler2 in einem Label auf einem Formular aus (synchronisiert).
Beende den Thread vor dem Beenden der Anwendung.

Verwende keinen Timer, kein Sleep und kein Processmessage!

Setze im Formular ein paar Controls ein, mit denen Du irgendetwas tun kannst.
Verschiebe das Formular und ändere die Größe, um zu sehen, ob das flüssig läuft.

Die Zwischenstände kannst Du ja hier als Zip hochladen, so dass man mal schauen kann, wo es evtl. nicht passt...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 13. Apr 2022, 10:17
Hallo Strahli, hier mein Versuch Deine Aufgabenstgellung zu lösen. Sicher nicht das Gelbe vom Osterei.
Delphi-Quellcode:
unit Unit1;

interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Vcl.WinXCtrls, Vcl.ExtCtrls;

type
  TheThread = class(TThread)
  private
    procedure DoIt;
  public
    procedure Execute; override;
  end;


type
  TForm1 = class(TForm)
  CounterLabel: TLabel;
  StartThreadBtn: TButton;
  btnclose: TButton;
  procedure btncloseClick(Sender: TObject);
    procedure StartThreadBtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TheThread.DoIt;
var Zaehler1, Zaehler2, erg1: Integer;
begin
  for Zaehler1 := 0 to 1000000 do
  erg1:=Zaehler1;

  Zaehler2:=1;
  Zaehler2 := Zaehler2 + 1;
  Zaehler1:=0;

  begin
    Form1.counterlabel.Caption := Zaehler2.tostring;
  end;
end;

procedure TheThread.Execute;
begin
  Synchronize(DoIt);
end;

procedure TForm1.btncloseClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.StartThreadBtnClick(Sender: TObject);
var
  Thread: TheThread;
  I: integer;
begin
  try
    Thread := TheThread.Create(True);
    Thread.FreeOnTerminate := true;
    Thread.Start;
    Thread.ShutdownThread;
  except
    on E:Exception do
    begin
       MessageDlg(E.Message, mtError, [mbOK], -1);
    end;
  end;

end;

end.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.457 Beiträge
 
Delphi 12 Athens
 
#3

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 13. Apr 2022, 10:31
Moin...

1. Dein Thread macht im Exeute, außer Sync aufrufen, nichts.
2. Sync arbeitet nur im HauptTread

Fazit:
Der Thread ist nutzlos.

Versuche mal an die Aufgabenstellung erst mal anders ranzugehen.

1. Das EXCECUTE macht die Arbeit im HINTERGUND.

Wenn das fertig ist, dann über die Rückmeldung an den Haupthread nachdenken. (Form mit Labels etc.)
Hinweis: z.B. bei einer Million Durchläufen braucht man die Oberfläche nicht permanent updaten. 1% MAX Menge reicht. Heißt: Sync nur 1% auslösen.

  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 13. Apr 2022, 11:02
ich glaube, es ist besser, ich lasse es mit dem Erkundungsprojekt "Threads", denn ich habe überhaupt kein Plan, wie ich diese Aufgabenstellung umsetzen soll.
Ich bin wie vernagelt und kann tatsächlich nichts Sinnvolles beitragen.
Wäre es zuviel verlangt, mir eine Lösung zu zeigen, wie man mit einem oder gar zwei ganz einfachen Threads sinnvoll arbeiten kann?
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 13. Apr 2022, 13:17
Aus Zeitgründen mal ins Unreine und zum rantasten...

DoIt brauchst Du nicht.
Im Create kannst Du ein Label übergeben und in fLabel speichern (Constructor entsprechend überschreiben).
Execute kann ungefähr so aussehen:

Delphi-Quellcode:
  procedure TMyThread.Execute;
  var
    I1, I2: Cardinal;
  begin
    I1 := 0;
    I2 := 0;
    try
      while (not Terminated) do
        begin
          Inc(I1);
          if (I1 >= 1000000) then
            begin
              Inc(I2);
              Synchronize(
                procedure
                  begin
                    fLabel.Caption := I2.ToString;
                  end);
              I1 := 0;
            end;
        end;
    except
      raise;
// on e: exception do begin
// mache hier irgendetwas mit dem Fehler.
    end;
  end;
Der Thread läuft also dauernd durch und berechnet etwas. In Abständen wird ein Zwischenwert in dem Label ausgegeben.
Synchronize wartet dafür, bis die VCL bereit ist, dem Thread eine Änderung zu ermöglichen. So lange steht die Schleife still.
Während der Synchronisierung steht die VCL still (was man aber nicht merkt, da die Synchronisierung nur kurze Zeit braucht. Wenn die aber eine Minute brauen würde, würde die VCL eine Minute hängen.
Nach der Synchronisierung arbeitet der Thread wieder weiter.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (13. Apr 2022 um 13:23 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 13. Apr 2022, 15:30
vielen Dank für eure Geduld #Stahli und #hentschman. Ihr habt mir zurückliegend schon öfter mal geholfen.
Aktuell gebe ich auf, denn ich verstehe es einfach nicht.
Nun habe ich vor kurzer Zeit das aktuelle Buch von Marcu Cantu für mich übersetzt, gelesen und doch wohl wieder kaum was dazugelernt. Jedenfalls zeigt
es mir die aktuelle Praxis.
Ich bin so was von gefrustet wegen meiner Stümperei und werde wohl Delphi für einige Zeit oder auch länger in die Ecke werfen.
Norbert

Geändert von EdAdvokat (13. Apr 2022 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 13. Apr 2022, 16:51
Das wird schon.

Im MyThread.Execute muss in einem einzelnen Schritt oder in einer Schleife ein Problem gelöst werden.
Wenn Execute verlassen wird, ist der Thread fertig.

Währenddessen können andere Threads oder eben auch die VCL ihre eigenständigen Aufgaben erledigen.
Im Grunde ist jeder Thread ein eigenständiges Programm.

Die VCL-Anwendung ist das, was der Nutzer sieht. Da läuft auch eine Dauer-Schleife:
- FormularZeichnen,
- TastaturPrüfen,
- MausPrüfen,
- EreignisseAbarbeiten,
- GuckenObEinThreadEtwasTunMöchte, // dann dessen Code dazwischen schieben
- WennNichtProgrammendeSchleifeVonVorn

Man darf nicht zwischen verschiedenen Threads (auch die VCL ist ein Thread) untereinander auf Daten zugreifen. Deshalb müssen die Threads sich gegenseitig abstimmen und den eigenen Ablauf ggf. anhalten. Für die VCL funktioniert das mit Synchronize.

Ich würde da noch nicht aufgeben an Deiner Stelle. Ist normal, dass man etwas Zeit braucht.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 20. Apr 2022, 09:35
Zitat:
Versuche mal an die Aufgabenstellung erst mal anders ranzugehen.
Ich würde auch diesen Quatsch mit DoIt weglassen. Geb den Dingern entweder richtige Namen oder lass die besser jetzt erstmal komplett weg.
  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 12:48 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