AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi String von Thread an Programm senden - Stilfrage!
Thema durchsuchen
Ansicht
Themen-Optionen

String von Thread an Programm senden - Stilfrage!

Ein Thema von TheMiller · begonnen am 22. Feb 2008 · letzter Beitrag vom 25. Feb 2008
Antwort Antwort
Seite 3 von 5     123 45      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#21

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 15:59
Kann ich das irgendwie synchronisieren?
  Mit Zitat antworten Zitat
Macci

Registriert seit: 31. Mai 2007
129 Beiträge
 
#22

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 16:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#23

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 17:17
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".
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#24

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 18:18
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#25

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 19:01
Habe den Zugriff mittels weiterer Prozedur "ChangeVar" und dem Aufruf "Synchronzie(ChangeVar)" aus Execute synchronisiert - allerdings ohne Erfolg!
  Mit Zitat antworten Zitat
Macci

Registriert seit: 31. Mai 2007
129 Beiträge
 
#26

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 19:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#27

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 19:09
Also, die Ursache des Problems - unabhängig von eurem "Prinzipstreit" (nicht böse gemeint ) - 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.
  Mit Zitat antworten Zitat
Macci

Registriert seit: 31. Mai 2007
129 Beiträge
 
#28

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 19:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#29

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 19:15
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.
Angehängte Dateien
Dateityp: zip delphi_threadsync_405.zip (6,4 KB, 17x aufgerufen)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#30

Re: String von Thread an Programm senden - Stilfrage!

  Alt 24. Feb 2008, 19:18
Zitat:
Synchronize in einer DLL funktioniert nie.
Das könnte echt einige fehlgeschlagene Versuche erklären

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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 11:11 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