Autor Beitrag
Sibi
Hält's aus hier
Beiträge: 2

Win 2000, Win Xp, Win NT
D7 Enterprise
BeitragVerfasst: Do 08.04.04 16:23 
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:

ausblenden 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:

ausblenden 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

_________________
Sibi
Ich hol mir in der Zwischenzeit mal 'nen Kaffee ;-)
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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

_________________
JSXGraph
Sibi Threadstarter
Hält's aus hier
Beiträge: 2

Win 2000, Win Xp, Win NT
D7 Enterprise
BeitragVerfasst: 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

_________________
Sibi
Ich hol mir in der Zwischenzeit mal 'nen Kaffee ;-)
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 09.04.04 13:07 
Ein Thread gibt einen Exit-Code zurück, über den kannst du deine Fehlercodes realisieren...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!