Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

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 22. Feb 2008 23:04

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

wicht 23. Feb 2008 04:11

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:
DataContainer.myVariable := 'threaddaten!';
Die Daten verändern, und der Hauptthread wird sogar über die Änderung informiert.

So habe ich es jedenfalls verstanden. Und der Code hier ist nur so geschrieben, bestimmt ein Fehler drin :mrgreen:

sirius 23. Feb 2008 08:08

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

Zitat von wicht
So habe ich es jedenfalls verstanden.

So habe ich es auch gedacht :zwinker: (außer dass du vor der Deklaration von DataContainerChange noch "procedure" schreiben müsstest)

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

TheMiller 23. Feb 2008 08:49

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!

SirThornberry 23. Feb 2008 09:52

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.

sirius 23. Feb 2008 10:34

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

Zitat von SirThornberry
Aber davon unabhängig reicht es wenn du den Zugriff auf den String mit einer CriticalSection absicherst.

Zitat:

Zitat von Sirius
SimpleRWSync kapselt CriticalSections.

:zwinker:

TheMiller 24. Feb 2008 13:40

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!

sirius 24. Feb 2008 13:53

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)

TheMiller 24. Feb 2008 15:46

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:
public
  DataContainer: TContainer;
end;

procedure Execute(...)
begin
  DataContainer.myVariable:='Hallo';
end;
Hauptprogramm

Delphi-Quellcode:
Th := TMyThread.create(true);
Th.DataContainer:=dataContainer;
Th.Resume;
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?

alzaimar 24. Feb 2008 15:50

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.
Seite 2 von 5     12 34     Letzte »    

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