AW: Verständnisfrage zur Thread-Synchronisation
Auf jeden Fall sollte dir erst mal klar sein was Synchronize() überhaupt macht:
- der aufrufende Thread wird angehalten - Wenn der Hauptthread irgendwann mal nichts zu tun hat wird die übergebene Methode vom Hautpthread aufgerufen und abgearbeitet. Während der Abarbeitung der Methode kann der Hauptthread natürlich nichts anderes machen. - nachdem der Hauptthread die Methode beendet hat, wird auch der aufrufende Thread fortgesetzt |
AW: Verständnisfrage zur Thread-Synchronisation
Die Frage ist doch auch, ob du dich in Threads einarbeiten und sie verstehen oder ob du ein Problem lösen möchtest, sprich: eine konkrete Aufgabe mit Threads schneller abarbeiten möchtest. Im zweiten Fall könntest du dir einfach die OTL (OmniThreadLibrary von Primož Gabrijelčič) anschauen. Auch sonst erfährst du in seinem Online-Buch und in den Beispielen auch einiges über die Architektur von Threads.
|
AW: Verständnisfrage zur Thread-Synchronisation
Zitat:
Der aufrufende Thread blockiert, bis der Hauptthread die Methode abgearbeitet hat und das signalisiert. |
AW: Verständnisfrage zur Thread-Synchronisation
#Benmik: Es ist eher das erste. Ich will mich in das spannende Thema "Threads" einarbeiten und habe aktuell kein zu lösendes Problem, wofür ich Threads einsetzen sollte.
Es ist die Spannung, die entstehen soll, wenn eine "neue Tür" aufgestoßen wird und Erbauung erwartet wird. Noch klemmt bei mir diese Tür, doch ich werde die Beiträge und meine bisherigen Versuche nochmals durchgehen, in der Hoffnung auf Eingebung. Ich danke euch für die Hinweise. |
AW: Verständnisfrage zur Thread-Synchronisation
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... |
AW: Verständnisfrage zur Thread-Synchronisation
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. |
AW: Verständnisfrage zur Thread-Synchronisation
Moin...8-)
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. :thumb: 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. :wink: |
AW: Verständnisfrage zur Thread-Synchronisation
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? |
AW: Verständnisfrage zur Thread-Synchronisation
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:
Der Thread läuft also dauernd durch und berechnet etwas. In Abständen wird ein Zwischenwert in dem Label ausgegeben.
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; 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. |
AW: Verständnisfrage zur Thread-Synchronisation
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 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