![]() |
Re: String von Thread an Programm senden - Stilfrage!
Kann ich das irgendwie synchronisieren?
|
Re: String von Thread an Programm senden - Stilfrage!
Warum willst du es so umständlich machen? Mit Synchronize geht es doch ganz einfach. Also genau so, wie du es zu Anfang schon geschrieben hast, nur dass du statt
Delphi-Quellcode:
einfach
procedure TMyThread.Execute;
var str: String; begin str:='Hallo, ich bin ein Test'; s^:=str; end;
Delphi-Quellcode:
schreibst.
procedure TMyThread.foo;
var str: String; begin str:='Hallo, ich bin ein Test'; s^:=str; end; procedure TMyThread.Execute; begin Synchronize(foo); end; |
Re: String von Thread an Programm senden - Stilfrage!
Ok, das wäre auch eine Idee, aber in der anderen Lösung wird die Variable lesend oder/und schreibend geschützt, sodass nahezu alle Komplikationen ausgeschlossen sind.
Angenommen der User klickt schnell im Formular rum und löst 2 Threads aus, die Daten empfangen und schreiben beide auf die gleiche Variable, so wird mindestens eine Prozedur nicht richtig ausgeführt, da die Informationen schon durch den anderen Thread überschrieben worden sind. So müsste das eigentlich sein, wenn ich das jetzt alles richtig verstanden habe. Und da dieses Szenario durchaus leicht vorkommen kann, gehe ich lieber auf "Nummer sicher". |
Re: String von Thread an Programm senden - Stilfrage!
Synchronisiere erstmal den Zugriff auf die Container-Eigenschaft 'MyVariable'.
@Macci: Wenn Du weiterhin Anwendungen entwickeln willst, die sporadisch abk***en, dann nur weiter so. Wenn nicht, dann verwende solche Kontainerklassen. :zwinker: |
Re: String von Thread an Programm senden - Stilfrage!
Habe den Zugriff mittels weiterer Prozedur "ChangeVar" und dem Aufruf "Synchronzie(ChangeVar)" aus Execute synchronisiert - allerdings ohne Erfolg!
|
Re: String von Thread an Programm senden - Stilfrage!
Zitat:
An alzaimar: Falsch, wenn man vermeiden will, dass Programme "sporadisch abkacken" (=nichtdeterministisches Verhalten wegen der Nebenläufigkeit von Threads entsteht) sollte man dafür Semaphore oder Mutex (=binäre Semapohore) verwenden. Genau das passiert im Grunde bei einer synchronisierten Methode. Deshalb verstehe ich nicht, wo du da ein Problem sieht. |
Re: String von Thread an Programm senden - Stilfrage!
Also, die Ursache des Problems - unabhängig von eurem "Prinzipstreit" (nicht böse gemeint :wink: ) - bei der vorgeschlagenen ContainerLösung scheint wirklich der Aufruf der DLL mit Windows.SetParent zu sein.
Ich habe ein neues Beispielprojekt erstellt, die Variablenänderung nochmals Synchronisiert und es funktioniert. Aber was mach ich nun? Würde gerne die Einbindung des Moduls in den festen Bereich der Hauptanwendung behalten. |
Re: String von Thread an Programm senden - Stilfrage!
Hi DJ-SPM,
du kannst ja mal folgendes ausprobieren, probeweise:
Delphi-Quellcode:
Sobald du jetzt den Programmablauf des Threads TTest anstößt (z.B. mit TTest.Create(False); ) wird das ganze Programme festhängen - der Nutzer kann in dieser Zeit nirgendswo hinklicken. Brauchst dir also keine Sorgen machen, dass gleichzeitig mehrmals auf den String schreibend zugegriffen wird.
procedure TTest.Execute;
begin { Thread-Code hier plazieren } Synchronize(foo); end; procedure TTest.Foo; begin while true do; end; |
Re: String von Thread an Programm senden - Stilfrage!
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, du musst natürlich in dem NotifyEvent aufpassen, dass du da immer noch im Thread bist.
Wenn du das Event, dass sich eine Variable geändert hat, lieber im MainThread ausführen willst, müsste man wahrscheinlich mit eine Message arbeiten. Oder auch einen Thread erstellen, der alle Threads verwaltet. Ich habe mal im Anhang die mit einer asynchronen Message (asynchrone Messages sind risikofrei) veränderten TContainer-Klasse in einem Test-Programm. Edit: Synchronize in einer DLL funktioniert nie. Edit2: Und ich habe die Ableitung mal von TMultiReadWrite.... auf TSimpleRWSync geändert. |
Re: String von Thread an Programm senden - Stilfrage!
Zitat:
Mit Messages kann ich soweit umgehen (denke ich). Ich verwende sie zum Beispiel um die DLL wieder ordentlich zu entladen, wenn der Benutzer das Modul schließt. Ich schaue mir das Beispiel gerade mal an. Ich danke euch nochmal für die Mühe, die ihr euch macht! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 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