Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 05:37

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Thread und Klassen
BeitragVerfasst: Sa Nov 01, 2003 11:43 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
hi,

ich muss gerade für die Schule etwas in Delphi machen.. dafür bräuchte ich Threads. Erst hab ich ne goße Klasse gemacht, die nen Thread als Memberfunktion hatte.Da gabs beim Aufruf des Threads immer ne zugriffsverletzung.
Was ich bräuchte, wäre ein Thread, der (ohne Instanzen) auf die Membervariablen meiner Klasse zugreifen kann.
Ich hab mir auch schon mal die klasse Tthread angeschaut, aber so richtig schlau bin ich da nciht geworden... besonders aus dem override.
Wäre sehr nett wenn mir jemand helfen könnte.

mfg
mindwalker

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Ich versteh dein Problem jetzt nicht so recht, aber guck dir mal das Thread-Tutorial an. Das würde sicherlich helfen

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Mein Problem ist, dass ich einen Thread als Memberfunktion habe, dieser beim Aufruf aber eine zugriffsverletzung liefert.
Ich weiß wie man Threads macht, aber als Memberfunktion scheinen sie nicht zu funktionieren.
Da ich aber in meinem Thread auf die Membervariablen der Klasse angewiesen bin, suche ich nach einer Lösung, wie ich das hinbekomme.
Hier mal nen Codeauszug meienr jetzigen, "fehlerhaften" Implementierung:

Code:
  1.  
  2. //[...]
  3. Interface
  4. type tklasse=class
  5. private
  6. procedure start_thread;
  7. procedure io_thread;
  8. //[...]
  9. end;
  10.  
  11. implementation
  12.  
  13. procedure tklasse.start_thread;
  14. var ThreadID: DWORD; //Thread-ID
  15. ThreadHandle: THandle; //Rückgabewert von CreateThread
  16. begin
  17. ThreadHandle:=CreateThread(nil, 0,
  18. TFNThreadStartRoutine(@tklasse.io_thread),nil, 0, ThreadID);
  19. if ThreadHandle<>0 then CloseHandle(ThreadHandle);
  20. end;
  21.  
  22. procedure tklasse.io_thread;
  23. begin
  24. //hier wird die Zugriffsverletzung angezeigt
  25. //hier steht noch alls mögliche
  26. end;
  27.  
  28. //[...]
  29.  

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 14:19 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Die Thread-Id und das Thread-Handle gehen ja verloren, sobald die Funktion fertig ist. Würde sagen daran liegts.

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 14:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich würde dir auf jeden Fall empfehlen erst einmal das Tutorial durch zu lesen. Und dann die Klasse TThread zu benutzen. Das ist eine sehr komfortable Kappselung von Delphi. Diese Klasse leitest du ab und überschreibst die Methode Execute. Gestartet wird der Thread durch Resume.
Wenn du auf Variablen oder Methoden einer anderen Klasse zugreifen möchtest musst du die Aufrufe (in vielen Fällen) Synchronisieren. Wie das geht und wann du das tun musst habe ich (glaube ich jedenfalls) ganz gut in dem Tutorial beschrieben.

PS: Den Thread durch diese Methoden zu erstellen ist in Delphi nicht nötig. Wir ham doch kein C++. ;)
Abgesehen davon Hat HomerS recht. Deine Handle und die ID gehen verloren. Die musst du natürlich als Member halten um sie dann wieder frei geben zu können. Aber warum das Rad zwei mal erfinden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
HomerS hat geschrieben:
Die Thread-Id und das Thread-Handle gehen ja verloren, sobald die Funktion fertig ist. Würde sagen daran liegts.

Daran liegts schon mal nicht, mach ich das ganze so ohne Klassen gehts ja...

@Lossy
Ich hab mir jetzt mal das Tutorial durchgelesen... da steht größtenteils zeug drinne, dass ich eh nicht brauche. Irgendwie fine ich diese Thread Klasse relativ umständlich im Vergleich zur simplen kurzen Win-Api Lösung :(
Außerdem hab ich leider nicht so viel Ahnung, wie ich das ganze jetzt benutzen soll.
Wie kann ich es denn einrichten, dass der Thread Zugriff auf die Membervariablen meiner Klasse bekommt... also ohne irgendwelches synchronisieren erst mal...

Edit: normal programmiere ich ja C++, nur ist das wie gesagt etwas von der Schule aus... und da müssen wir halt Delphi benutzen.

Edit2:
Zitat:
Deine Handle und die ID gehen verloren. Die musst du natürlich als Member halten um sie dann wieder frei geben zu können.

Also in dem Tutorial, wo ich den Code her habe wird mit denen ncihts mehr gemacht. Mein Thread hört auch alleine auf, deshalb denke ich nicht, dass es da irgendwie zu Problemen kommen kann.

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 16:00 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ich weiß, ich gehöre immer zu den Leuten, die den Knüppel nehmen und immer nachschlagen, wenn jemand bereits am Boden liegt ;) Ich möchte Dir auch unbedingt die Thread-Klasse ans Herz legen. Habe mich früher auch oft mit den API-Funktionen abgeärgert. Mit einer Klasse hat man eine schöne Übersichtliche Kapselung die dann auch noch sauberer ist (sprich auch kompatibel zu CLX)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 16:50 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Zitat:
Also in dem Tutorial, wo ich den Code her habe wird mit denen ncihts mehr gemacht. Mein Thread hört auch alleine auf, deshalb denke ich nicht, dass es da irgendwie zu Problemen kommen kann.


Das stimmt so nicht. Auch die Thread - Klasse gibt das Handle wieder frei, nur wird es im Destructor gemacht und da normalerweise ein Thread sich automatisch selbst frei gibt, werden auch die Handles wieder freigegeben.

Es gilt fast immer unter der Win-API, dass manuell reservierte Handles auch manuell wieder freigegeben werden müßen. Sicher, vieles macht das Windows automatisch, aber ein sauberer Programmierstil ist das nicht.

Ich rate auch zur TThread - Klasse. Was wichtig ist, Du must, bevor Du auf Variablen außerhalb der Thread - Klasse zugreifst, dies über die Methode Synchronize machen. Aber ohne Quellcode kann viel spekulieren ohne das Problem zu lösen.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 17:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Richtig. Auch wenn sich dein Thread selber Terminiert musst du das Handle wieder frei geben.

Aber zu deiner Frage. Auf Membervariablen einer anderen Klasse kannst du ganz einfach zugreifen.
Du kannst in deiner Threadklasse eine Membervariable deklarieren die deine andere Klasse wiederspiegelt (F_Irgendwas: TForm) und nach dem erstellen des Threads weist du diese zu. Weil Klassen in Delphi "nur" Pointer sind greifst du somit direkt auf die andere Klasse zu. Und aus deinem Execute kannst du Methoden aufrufen oder Eigenschaften verändern. Nur Bedenke, dass diese teilweise Synchronisiert werden müssen. Also alles was irgendwo geschrieben wird. Und dabei ist die einfachste Methode das Synchronize.

Aber für dich ist es jetzt durchaus auch so, dass du mit der TThread Klasse mehr Schreibarbeit hast aber sobald es ans Synchronisieren geht dann hättest du mit der normalen WindwosAPI viel unverständlicheren Code als es so der Fall wäre. Nebenbei ist es so ObjektOrientiert was auch einen guten Eindruck bei deinem Lehrer hinterlässt. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
jo vielen Dank schon mal. Ich hab nur noch eine kleine Frage, wie geht das mit dem klassen zuweisen?
Ich muss den Thread aus meiner Klasse aus starten.... wäre es nicht auch ne Lösung, den Thread als Membervariable in meine Klasse reinzupacken?

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie gesagt. Du machst dir eine Variable von dem Txpen wie deine andere Klasse und weist sie zu.
Code:
  1.  
  2. private
  3.   F_Ding: TForm;
  4. public
  5.   property Ding: TForm read F_Ding write F_Ding;
  6.  
  7.   // Und dort wo du den Thread erstellst.
  8.  Thread.Ding := IrgendEinAnderesDingOderSowas;
  9.  


Du kannst dir natürlich den Thread als Variable auch in deine Erzeugerklasse packen. Es kommt aber darauf an ob du mit dem Thread noch einmal etwas machen möchtest. Wenn er nur etwas sortieren soll und das wieder automatisch wegschreibt brauchst du das nicht. Wenn du aber (bei einem RenderThread) ihm ab und an mal eine Fenstergröße übergeben möchtest dann solltest du ihn dir natürlich merken.

PS: Wenn du ihn merkst achte bitte darauf, dass er sich nicht frei gibt (FreeOnterminate) und du dann drauf zugreifst. Und andersrum natürlich auch. Also, dass er sich dann von alleine frei gibt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
ok... jetzt ist alles halbwegs klar. Ich hab nur noch eine kleine Frage:
Also ich will den Thread in einer Funktion meiner Klasse erstellen, also die heißt emotor. Da ich innerhalb der klasse aber keine Objekte der klasse habe kann ich ja jetzt schlecht schreiben
Code:
  1.  Thread.Ding := objektvonemotor;

Was kann ich denn da schreiben (geht das mit self?), oder hab ich etwas falsch verstanden?

Kurz zur Funktion meines Threads, der soll eigentlich nur Input Signale der seriellen Schnittstelle auslesen, in bestimmte membervariablen schreiben und die an der seriellen Schnittstelle hängenden Motoren steuern (je nach Setzung der membervariablen). Deshalb besteht der thread aus ner Endlosschleife, die nur verlassen wird, wenn eine Membervariable auf "Motoraus" gesetzt wird.
Ich glaube nicht, dass es da zu Problemen mit dem Hauptthread kommt, weil es keine Variablen gibt, die von beiden Threads "beschrieben" werden.

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also wenn in deine Variablen nur ein Thread schreibt ist das kein Problem. Dann musst du dabei nichts synchronisieren.

Und ja. Self ist die aktuelle Instanz der Klasse. Du kannst also
Code:
  1. Thread.Ding := Self;
verwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 02, 2003 17:18 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Ok, vielen Dank für eure Geduld und Hilfe... funktioniert jetzt alles perfekt.

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]