![]() |
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 |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
verstehe ich nicht ganz, wo deiner meinung nach sollte ich es machen ???
|
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Wenn z.B. in der Methode "onE" eine Zeile: "Form1.Memo1.Lines.Clear;" vorkommt, dann schreib dir dafür eine eigene Methode - z.B.:
Delphi-Quellcode:
und in der Methode "onE" dann aufrufen mit:
procedure TMyThread.ClearLines;
begin Form1.Memo1.Lines.Clear; end;
Delphi-Quellcode:
Das Problem ist, dass du in deinem Thread ja NUR die Methode "onE" ausführst, und wenn diese dann komplett Synchronized ausgeführt wird, dann wird dein 2. Thread vollständig im Hauptthread ausgeführt, was man ja gerade mit Threads verhindern will. Also sollte an so wenig Stellen wie möglich Synchronized werden.
procedure TMyThread.onE;
begin . . Synchronized(ClearLines); // an Stelle von Form1.Memo1.Lines.Clear; . . end; Zeig doch wenn es noch nicht klar ist die "onE" - evtl. kann man's am konkreten Bsp. besser erklären. :cheers: dizzy \\edits: Schlechtschreibdinger... |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
ok:
Delphi-Quellcode:
{
Fürht immer die funktion CheckPlay aus date : 28.07.2004 upDatet : 28.07.2004 } procedure TSound.onE; begin CheckPlay; end;
Delphi-Quellcode:
{
Schaut nach ob die musik zu ende ist oder nicht date : 28.07.2004 upDatet : 28.07.2004 } procedure TSound.CheckPlay; begin if (PlayMusikIndex > -1) and (isRandom = False) then begin if (Musik[PlayMusikIndex].Module <> NIL) and (FMUSIC_IsFinished(Musik[PlayMusikIndex].Module) = True) then randomMusik; if (Musik[PlayMusikIndex].Stream <> NIL) and ( FSOUND_IsPlaying(Musik[PlayMusikIndex].Channel) = False) then randomMusik; end; end; |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
Delphi-Quellcode:
Hmmmm... Also wenn Musik, PlayMusikIndex, isRandom, FMUSIC_IsFinished, FSOUND_IsPlaying und randomMusik alles Felder und/oder Methoden von TSound sind, und randomMusik auch nur Zugriffe auf TSound-eigene Felder/Methoden macht, dann liegt das Problem wo anders - und ich wüsste auf Anhieb jetzt nicht wirklich wo :?.
// etwas hübscher: ;)
procedure TSound.CheckPlay; begin if (PlayMusikIndex > -1) and (isRandom = False) then begin if ((Musik[PlayMusikIndex].Module <> NIL) and (FMUSIC_IsFinished(Musik[PlayMusikIndex].Module) = True)) or ((Musik[PlayMusikIndex].Stream <> NIL) and (FSOUND_IsPlaying(Musik[PlayMusikIndex].Channel) = False)) then randomMusik; end; end; Für den Fall, dass da z.B. eine DLL oder eine Kompo der VCL mit im Spiel ist (was ich hieraus nicht erkennen kann), dann wäre ein Synchronize hier und da angebracht. Aber es ist doch lediglich eine Prüfung, ob noch etwas angespielt wird, oder? Wäre es da nicht einfacher einfach einen Timer zu nehmen, der alle paar Sekunden mal nachschaut? |
Re: TThread-Execute wird nicht ausgefürhrt warum ?
das habe ich versucht mit einem Timer zu machen, doch leider ruckelt dann das Spiel, egal was ich für ein intervall nehme
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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