Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi String von Thread an Programm senden - Stilfrage! (https://www.delphipraxis.net/109004-string-von-thread-programm-senden-stilfrage.html)

TheMiller 24. Feb 2008 15:59

Re: String von Thread an Programm senden - Stilfrage!
 
Kann ich das irgendwie synchronisieren?

Macci 24. Feb 2008 16:57

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:
procedure TMyThread.Execute;
var
  str: String;
begin
  str:='Hallo, ich bin ein Test';
  s^:=str;
end;
einfach

Delphi-Quellcode:
procedure TMyThread.foo;
var
  str: String;
begin
  str:='Hallo, ich bin ein Test';
  s^:=str;
end;

procedure TMyThread.Execute;
begin
Synchronize(foo);
end;
schreibst.

TheMiller 24. Feb 2008 17:17

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".

alzaimar 24. Feb 2008 18:18

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:

TheMiller 24. Feb 2008 19:01

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!

Macci 24. Feb 2008 19:05

Re: String von Thread an Programm senden - Stilfrage!
 
Zitat:

Zitat von DJ-SPM
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".

Nein, dieses Szenario kann niemals vorkommen, da der Nutzer nicht irgendwohin klicken kann, während eine synchronisierte Methode abläuft.

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.

TheMiller 24. Feb 2008 19:09

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.

Macci 24. Feb 2008 19:14

Re: String von Thread an Programm senden - Stilfrage!
 
Hi DJ-SPM,

du kannst ja mal folgendes ausprobieren, probeweise:

Delphi-Quellcode:
procedure TTest.Execute;
begin
  { Thread-Code hier plazieren }
  Synchronize(foo);
end;

procedure TTest.Foo;
begin
while true do;
end;
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.

sirius 24. Feb 2008 19:15

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.

TheMiller 24. Feb 2008 19:18

Re: String von Thread an Programm senden - Stilfrage!
 
Zitat:

Synchronize in einer DLL funktioniert nie.
Das könnte echt einige fehlgeschlagene Versuche erklären :wall:

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.
Seite 3 von 5     123 45      

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