![]() |
TThread-Execute wird nicht ausgefürhrt warum ?
Hallo,
ich habe ein problem beim erzeugen von einem TThread Object. so erzeuge ich ihn:
Delphi-Quellcode:
procedure TSound.TInit;
var t:TSoundWihle; begin t:=TSoundWihle.Create(True); t.onE:=onE; t.Priority := tpLower; t.Resume; end; mein unit für das TThread-object:
Delphi-Quellcode:
problem ist:
unit wihle;
interface uses Classes; type TE = procedure of Object; TSoundWihle = class(TThread) private { Private-Deklarationen } protected public onE: TE; procedure Execute; override; end; implementation { TSoundWihle } procedure TSoundWihle.Execute; begin while Terminated = True do begin onE; end; end; end. ich muss ein ereignis immer ausführen damit in diesem ereignis checkPlay meiner sound unit ausgeführt werden kann.... warum wird jetzt Execute nicht ausgeführt? TInit wird aufgerufen, nachdem die sound klass komplet geladen ist !!! |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Wie wäre es mit :?:
Code:
...:cat:...
procedure TSoundWihle.Execute;
begin [color=#ff0000]while not Terminated do begin[/color] onE; end; end; |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
keine änderung habe ich bekomme jetzt dafür beim beenden eine fehlermeldung:
Zitat:
|
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Mal ne kleine Nebenfrage:
Muss man die property FreeOnTerminate nicht noch setzen?
Delphi-Quellcode:
procedure TSound.TInit;
var t:TSoundWihle; begin t:=TSoundWihle.Create(True); t.onE:=onE; t.Priority := tpLower; t.OnTerminate := DoMyTerminate() // <--- t.FreeOnTerminate := True bzw. False; // <--- t.Resume; end; ist ist sie standardmäßig false? |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
jetzt bekomme ich beim beenden:
Code:
diesen fehler !!!
---------------------------
Anwendungsfehler --------------------------- Exception EAccessViolation in Modul BreakOut.exe bei 00000000. Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000. --------------------------- OK --------------------------- |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Zitat:
Dein Problem ist, daß Du den Thread mit Deiner Anwendung syncronieseren musst. Suche dazu mal nach ![]() ...:cat:... |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
kein beitrag konnte mir weiter helfen :(
kannst du mir ein beispiel schreiben, was mit Synchronize arbeitet ??? weil das habe ich auch aus Luckis tutor nicht richtig verstanden !!!! |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Wenn du aus deinem Thread heraus auf Properties und Variablen eines anderen Threads (z.B. Controls auf dem Formular) zugreifst, so müssen diese Zugriffe synchronisiert werden. Die Zeilen die den Zugriff machen musst du in eine eigene Methode deiner Threadklasse packen, und mit Synchronize(MethodenName); aufrufen. Sonst kann es knallen.
gruss, dizzy |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
ich habs jetzt so gemacht:
Delphi-Quellcode:
nur jetzt hängt sich das progamm auf, und spielt die musik einfach weiter ab, macht aber sonnst nichts mehr :(
procedure TSoundWihle.Execute;
begin while not Terminated do begin Synchronize(onE); end; end; |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Ist auch logisch ;). Das Synchronized veranlasst, dass die Methode im Hauptthread der Anwendung ausgeführt wird! Deshalb kann man sich, so wie du es einsetzt, so alle Vorteile von einem Thread mit einem Schlag zu Nichte machen.
Du solltest INNERHALB deiner Methode alle Zugriffe die auf andere Threads passieren EINZELN Synchronized machen, nicht die ganze Methode! Solche Synchronized-Aufrufe sollte man so sparsam wie möglich einsetzen, und im Zweifelsfall das Vorgehen im Thread überdenken, da er dir sonst nichts bringt. :cheers:, dizzy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz