![]() |
Re: String von Thread an Programm senden - Stilfrage!
Hallo,
hab jetzt doch noch eine Frage. Und zwar verstehe ich nicht, wie der Thread oder das Mainform mit der Klasse arbeitet. Ich habe die Klasse da stehen, aber wie verändere ich jetzt via Thread oder MainForm variablen? Und wo liegen diese Variablen? Ist es so, dass diese Variablen IN der Klasse liegen und auch DORT verändert werden? Der Thread greift dann auf die Klasse zu und nimmt sich die Variablen? Wo wird die Klasse erstellt und instantiiert? Hab das jetzt alles gesehen und im Kopf verarbeitet, aber die Klasse steht da immernoch (in mir drin) zusammenhanglos rum. Kann auch daran liegen, dass es schon ziemlich spät ist, aber ich versteh's nicht so ganz Danke |
Re: String von Thread an Programm senden - Stilfrage!
Morgen,
ungefähr so müsste es sein:
Delphi-Quellcode:
type
TForm1=class(TForm) private DataContainer: TContainer; DataContainerChange(Sender: TObject); end; procedure TForm1.Create(Sender: TObject); begin DataContainer := TContainer.Create; DataContainer.OnChange := DataContainerChange; end; procedure TForm1.DataContainerChange(Sender: TObject); begin ShowMessage('Thread hat Daten verändert :-)'); end; procedure TForm1.Button1Click(Sender: TObject); var Th: TMyThread; begin Th: TMyThread.Create(True); // Th.s:=@s_thread; Th.DataContainer := DataContainer; Th.resume; end; Und im TThread.Execute kannst du dann eben mit
Delphi-Quellcode:
Die Daten verändern, und der Hauptthread wird sogar über die Änderung informiert.
DataContainer.myVariable := 'threaddaten!';
So habe ich es jedenfalls verstanden. Und der Code hier ist nur so geschrieben, bestimmt ein Fehler drin :mrgreen: |
Re: String von Thread an Programm senden - Stilfrage!
Zitat:
@DJ-SPM Letztenendes ist dass nur in String in eine Klasse gakpaselt. Und die übergibst dann nur die Klasse und kannst den String von außen Threadsicher ändern. |
Re: String von Thread an Programm senden - Stilfrage!
Das Beispiel ist klasse! Ich habe es jetzt glaub ich verstanden.
Zu dumm, dass ich es morgen testen kann, da ich jetzt auf eine Hochzeit im anderen Ende Deutschlands fahre :twisted: Naja, wird bestimmt auch lustig. Aber solche Prolematiken beschäftigen mich immer so lange, bis "ich" sie gelöst habe! Danke jedenfalls! |
Re: String von Thread an Programm senden - Stilfrage!
ich würde keine globale Variable nehmen sondern eine membervariable. Aber davon unabhängig reicht es wenn du den Zugriff auf den String mit einer CriticalSection absicherst.
|
Re: String von Thread an Programm senden - Stilfrage!
Zitat:
Zitat:
|
Re: String von Thread an Programm senden - Stilfrage!
Bin wieder da!!!
Nochmal eine Frage zur "Container-Lösung"... Habe sie jetzt implementiert und die Container-Klasse als Extra-Unit mit in den Thread und in die Applikation eingebunden. Du hast aber die Methode "setMyVariable" als private deklariert. So kann ich ja nicht vom Thread oder von UnitX auf diese Methode zugreifen - oder mache ich was falsch? Vielen Dank nochmals für den Code! |
Re: String von Thread an Programm senden - Stilfrage!
Dafür gibts ja das Property "myVariable". Dieses ruft im schreibenden Fall setmyVariable und im lesenden Fall getmyVariable auf.
Du solltest dir mal propertys anschauen, und wie die funktionieren :zwinker: Du brauchst also nur myVariable zu nutzen. Schau dir mal an, was "wicht" geschrieben hat! (Da ist nur ein winziger Fehler drin) |
Re: String von Thread an Programm senden - Stilfrage!
Ja, ich habe es genauso gemacht, aber auf diese Art und weise "hängt" sich der Thread auf, wenn ich die Variable ändere.
Thread:
Delphi-Quellcode:
Hauptprogramm
public
DataContainer: TContainer; end; procedure Execute(...) begin DataContainer.myVariable:='Hallo'; end;
Delphi-Quellcode:
Doch der Thread wird nicht bis zum Ende ausgeführt und die DataContainerChange wird auch nicht aufgerufen. Liegt das daran, dass die Anwendung, die den Thread aufruft, eine DLL mit DLL-Form ist und per Windows.SetParent in das Hauptprogramm eingebunden wird?
Th := TMyThread.create(true);
Th.DataContainer:=dataContainer; Th.Resume; |
Re: String von Thread an Programm senden - Stilfrage!
Hmm... Vielleicht liegts daran:
Im Thread=>SetMyVariable=>OnDataChange-Ereignis wird ausgelöst=>Im OnDataChange-Event wird die VCL benutzt => *aufhäng* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 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