AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread in eigene Klasse einbinden?

Ein Thema von Edlmann · begonnen am 16. Dez 2010 · letzter Beitrag vom 16. Dez 2010
Antwort Antwort
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#1

Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 14:18
Guten Nachmittag liebe DP,

ich arbeite im Moment an einem Programm zur Wegfindung (zum späteren Bau eines simplen 2D-Spiels) und benutze hierfür den
AStar-Algorithmus. Das Funktioniert soweit auch schon ganz gut, allerdings habe ich bisher die Berechnung des Pfades in einen
Thread ausgelagert, den ich jetzt in eine eigene Klasse einbinden Möchte. Ich erzeuge den Thread mit folgendem Aufruf:

Delphi-Quellcode:
var
  ThreadParams: PThreadParams;
  ThreadID: Cardinal;
begin
  New(ThreadParams);
  ThreadParams.Handle := FormHnd;
  CloseHandle(BeginThread(nil, 0, @Thread, ThreadParams, 0, ThreadID));
Nun möchte ich meinen Thread (die Funktion Thread, die Hier verwendet wird und damit die Pfadfindung) in eine eigene Klasse einbinden.
Also dass ich etwas deklarieren kann vom Typ TPathFinder, um mehrere Pfadfindungen parallel laufen zu lassen. Soweit so gut, Problem dabei:
Sobald ich die Thread Funktion in meine eigene Klasse einbinde, meckert er dass er als Funktion eine Variable übergeben haben will.

Der Aufruf sieht dann wie folgt aus:

Delphi-Quellcode:
  New(ThreadParams);
  ThreadParams.Handle := FormHnd;
  CloseHandle(BeginThread(nil, 0, @MyPather.Thread, ThreadParams, 0, ThreadID));
Warum funktioniert dies nicht? Der Header der Funktion Thread sieht wie folgt aus:
function TPathFinder.Thread(p: PThreadParams): Integer; Danke im Vorraus, Edlmann.

Geändert von Edlmann (16. Dez 2010 um 15:33 Uhr)
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 15:27
Hi,

das ist ein Standardproblem. Funktionszeiger und Methodenzeiger sind nicht das Gleiche, weil eine Methode noch den impliziten Self-Parameter übergeben bekommt.

Damit du eine Methode in BeginThread verwenden kannst, muss diese entweder parameterlos sein
function TPathFinder.Thread(): Integer; und du musst an BeginThread statt ThreadParams self übergeben oder du musst eine Klassenmethode verwenden:
class function TPathFinder.Thread(p: PThreadParams): Integer; static;
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#3

AW: Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 15:32
auch mit einer Klassenfuntion funktioniert es nicht, er meint immernoch dass eine Variable erforderlich sei.
Und Ohne dass ich die Funktion in die Klasse integriert habe funktioniert es auch, dann kann ich jedoch nicht mehrere Threads parallel erstellen.

Danke trotzdem.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 15:39
Wieso verwendest du direkt die Thread-Funktionen der Windows-API anstatt eine höhere Abstraktionsebene (Klasse TThread) zu wählen?
Andreas
  Mit Zitat antworten Zitat
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#5

AW: Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 15:45
Eben um meinem Thread in eine eigene Klasse zu packen, die wiederum verschiedene Methoden beherrscht...Ich könnte das ganze umstrukturieren, wollte aber erst mal schauen, ob es nicht auch anders geht. Eigentlich finde ich es schöner, eine Funktion zu haben, die eben als Thread läuft, als dafür direkt eine Klasse zu schreiben. Naja, muss ich dann mal schauen.

Danke für deine Hilfe,
Edlmann
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 15:52
Du musst, um einen Zeiger auf eine Klassenmethode zu erhalten, den Klassennamen angeben, nicht den Namen einer Variablen, die das Objekt hält. Also @TPathFinder.Thread statt @MyPather.Thread.
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: Thread in eigene Klasse einbinden?

  Alt 16. Dez 2010, 17:10
Eigentlich finde ich es schöner, eine Funktion zu haben, die eben als Thread läuft, als dafür direkt eine Klasse zu schreiben
Ein Thread läuft immer in einem bestimmten Kontext.
Er braucht Eingabedaten und liefert oder befüllt Ausgabedaten.
Wenn man einen Thread nur als Funktion sieht, dann "belügt" man sich selbst, weil der Kontext irgendwo als globale Variablen vorhanden sein muss.

Ganz anderst ist das bei der Klasse TThread.
Wenn man von TThread ableitet, dann sollte man darauf achten alle Eingabe- und Ausgabedaten als Properties anzulegen.
Beispiel:
Delphi-Quellcode:
// Thread-Klasse zur Berechnung der Mandelbrot Menge
TMandelbrotThread = class(TThread)
public
  procedure Execute; override;
   // Eingabeparameter
   property Ziel : TRect; // Bildausschnitt
   property xmin, xmax, ymin, ymax : double; // für Brechnung des Apfelmänchens benötigt
   property ColorTable : TColorTable; // Einfärbeschema

   // Ausgabeobjekt
   property Bitmap:TBitmap;
end;
Bei der Threadklasse siehst du genau, was der Thread an Input braucht und wohin das Ergebnis geht.
Sauber und Objektorientiert!
Würde es die Thread-Klasse nicht schon geben, dann müsste man sie erfinden.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:46 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