Autor Beitrag
Cashels
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Do 27.03.03 17:14 
Hallo,

ich hab mir ne Komponente gebastelt, welche automatisch bei einem Programmstart nach Updates im Internet sucht und gegebenfalls diesen auch runterlädt. Um den normalen Programmablauf nicht zu stören, läuft die ganze Routine in einem gesonderten Thread ab, d.h. meine Komponente startet intern einen eigenen Thread. Um jetzt in der Anwendung auf Fehler und Sonstiges zu reagieren, hab ich Ereignisse definiert, wie z.B. OnHostFound, OnUpdateFound usw. Diese Ereignisse werden auch wunderbar und zum richtigen Zeitpunkt aufgerufen. Je nachdem was ich jedoch ins Ereignis reinschreibe, spielt mir der Thread verrückt. Ich hab auch in der Komponente das Ereignis mittels Synchronize aufgerufen, aber dennoch klappts nicht.

Ich habe das Problem, daß die Ereignisse ja eigentlich in der Komponente definiert sind, während sie jedoch vom separatem Thread aufgerufen werden. Kann es sein daß Synchronize nur Threadintern funktionniert?

Besten Dank für irgendwelche Hinweise,
Gruss,
Tom
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 27.03.03 19:41 
Synchronize legt eine Botschaft in eine Synchronisierungsliste und lässt den Thread einschlafen. Wenn nun der Hauptthread nichts zu tun hat (Idle) dann wird diese Botschaft abarbeitet und die Methode aufgerufen.
Wenn du also in einer Schleife im Hauptthread hängst, musst du CheckSynchronize in der Schleife aufrufen.


Was machst du denn in den Ereignissen? Tritt der Fehler bei Code auf, der auf die VCL zugreift, oder allgemein?

_________________
Ist Zeit wirklich Geld?
Cashels Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Do 27.03.03 23:24 
Hmm,
ein Fehler an sich tritt so gesehen eigentlich nicht auf, nur scheint mein Thread nicht ganz abgearbeitet zu werden. Die Routine, welches das Update aus dem Internet lädt feuert alle 2kb ein Event ab, und das fang ich im Hauptthread ab. Schreib ich in dieses Ereignis nur nicht grafische Befehle (z.B. beep), klappt der Download. Sobald ich auf ein Canvas zugreif, tritt das Ereignis gar nicht mehr auf und der Download wird auch unterbrochen. Daher hab ich es mit synchronize ausprobiert.

Konkret, das Problem tritt also nur auf wenn ich auf die VCL zugreif.

Gruss,
Tom
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 28.03.03 10:25 
Mit Synchronize wird die übergebene Methode im Hauptthread abgearbeitet. Beinhaltet diese Methode also den Hauptteil des Threads, so wird das ganze Multithreading durch das Synchronize wieder zunichte gemacht. Du solltest dir also eventuell auch andere Synchronisationsmechanismen anschaun: Critical Sections, Semaphore, Mutex, Events

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Cashels Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Do 03.04.03 16:08 
Hallo,

das Problem ist soweit behandelt. Der Fehler lag im Kreieren einer Komponente innerhalbs des Threads, welche selbts wieder einen eigenen Thread erzeugte.

Danke für die Antworten,
Tom