Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eigenen event handler erstellen und zur Laufzeit zuweisen


Sibi - Do 08.04.04 16:23
Titel: Eigenen event handler erstellen und zur Laufzeit zuweisen
Hi Leute,

Ich glaube ich habe ein allgemeines Verständnisproblem mit event handlern. Was die ganzen Events betrifft welche man im Object Inspector von Delphi zuweisen kann, gibts es keine Probleme. Jetzt will ich aber einen event handler zur Laufzeit zuweisen.

Ein klein wenig Erläuterungen, damit man mein Problem besser versteht:

Irgentwo im Hauptthread meines Programmes spalte ich einen 2. Thread ab:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
// das hier steht im Interface-Teil von Form1
var
  threadDBLoader: Thread_DBLoader;

// das befindet sich im Implementation Abschnitt von Form1
begin
  threadDBLoader := Thread_DBLoader.Create(true);        //Thread erstellen
  threadDBLoader.FreeOnTerminate := true;                     //Der Thread soll nach Beenden seiner Ausführung wieder freigegeben werden
  threadDBLoader.OnTerminate := DBLoaderNotifyEvent;   //Hier möchte ich die Prozedur zuweisen welche nach Beenden des Threads
                                                                                          //aufgerufen werden soll
  threadDBLoader.dtStartTime := ...;                               //Thread initialisieren
  threadDBLoader.Resume;                                             //Thread ausführen
end;


Thread_DBLoader ist ein Object der Klasse TThread:


Delphi-Quelltext
1:
2:
type
  Thread_DBLoader = class(TThread)


Erreichen möchte ich damit folgendes:
Nach Beenden des abgespaltenen Threads soll das OnTerminate-Ereignis die Prozedur DBLoaderNotifyEvent ausführen (z.B. einfach nur eine Meldung ausspucken dass der Thread beendet ist).

Mein Problem betrifft nun genau diese DBLoaderNotifyEvent Prozedur. Ich habe keine Ahnung wo und wie ich diese Prozedur deklarieren und/oder implementieren muss :cry:

Hoffe da hat jemand mehr Erfahrung als ich...

Moderiert von user profile iconMotzi: Topic Verschoben


raziel - Do 08.04.04 19:04

:welcome:

du musst einfach eine Prozedur deklarieren, die exakt die gleichen Parameter hat wie diese "DBLoaderNotifyEvent" und diese Prozedur dann einfach .OnTerminate zuweisen.


raziel


Sibi - Fr 09.04.04 10:03

Ja danke,

ich habs inzwischen hin bekommen :D .

Ich hatte es Anfangs genau so gemacht, doch die Prozedur wurde nie aufgerufen. Das Problem lag aber darin dass ich meinen Thread in der letzten Anweisung mit EndThread() beendet habe. Irgentwie wird dieses OnTerminate Ereignis dann nicht ausgelöst, weiss der Geier weshalb :?:

Lässt man diese Anweisung weg, klappt es wie erwartet!


Besitzt man bei einem Thread eigentlich die Möglichkeit beim Beenden einen Rückgabewert an den Hauptthread zu übergeben. Es kann vorkommen dass die Anweisungen im 2. Thread nicht erfolgreich ausgeführt werden können (Datenbankzugriff usw...). In diesem Fall wäre es doch ganz sinnvoll wenn man eine Art Fehlercode an den Hauptthread weitergeben könnte.

Aus diesem Grund bin ich auch erst auf die Idee gekommen den Thread mit EndThread() + Fehlercode (EndThread(0), EndThread(-1),... je nachdem) abzuschliessen und den Fehlercode dann im Hauptthread auszulesen. Doch dann wird leider das onTerminate Ereignis nicht abgefeuert (zumindest scheint es so).

Kann man man das prinzipiell so machen??? Oder gibt es da Programmiertechniken von denen ich nach gar nichts weiss??? :wink:

na dann


Motzi - Fr 09.04.04 13:07

Ein Thread gibt einen Exit-Code zurück, über den kannst du deine Fehlercodes realisieren...