![]() |
Ereignishandler an Thread anhängen geht nicht
Hallo Delphianer,
bastel gerade an einer Klasse, welche als "Zwischenschicht" dienen soll. Und zwar für die TBassdllPlayerEx und meiner/ irgendeiner Anwendung. Nun gut, hier ein Codefetzen, welcher leider nicht funktioniert. Vielleicht hat jemand rat.
Delphi-Quellcode:
(Hab alles rausgeschmissen, wo ich denke, dass es nichts damit zu tun hat)unit uBassInterfaceLayer; interface uses Forms, // application.processmessages SysUtils, Classes, Controls, ExtCtrls, BassChannelU, BassdllPlayerEx ; var // Thread variables needs declaration here ?! _indiFadeouttime: Byte; _Threadruns: boolean; type TFadeoutThread = class(TThread) procedure Fadeout; procedure Execute; override; procedure _ThTimer1Event(Sender: TObject); procedure _ThTimer2Event(Sender: TObject); end; type TBassInterfaceLayer = class(TBassdllPlayerEx) private { Private declarations } (* variables *) (* getter and setter *) (* intern algos *) procedure Stop(whichone: Byte; Fadeouttime: Byte); protected { Protected declarations } public { Public declarations } published { Published declarations } (* Properties *) (* Methodes *) procedure Bil_Stop(Crossfadetime: byte); end; // type implementation var _internBass1: TBassdllplayerEx; _activeBass: Byte = 2; // so it will start with 1 ! _ThTimer1: TTimer; (* ************ *) (* intern algos *) (* ************ *) procedure TFadeoutThread.Execute; begin Fadeout; end; procedure TFadeoutThread.Fadeout; label goon; begin _Threadruns := true; try if _activeBass = 1 then begin while _internBass1.Channel[0].Volume > 0 do begin _internBass1.Channel[0].Volume := _internBass1.Channel[0].Volume - 1; sleep(_indiFadeouttime); end; _ThTimer1 := TTimer.create(nil); _ThTimer1.OnTimer := _ThTimer1Event; _ThTimer1.Enabled := true; // goto goon; end; except if _activeBass = 1 then freeandnil(_internBass1); // the hammer method CreateorFree_internBass(false,1); Terminate; _Threadruns := false; end; goon: // end Thread Terminate; _Threadruns := false; end; procedure TFadeoutThread._ThTimer1Event(Sender: TObject); begin _ThTimer1.Enabled := false; freeandnil(_internBass1); // the hammer method CreateorFree_internBass(false,1); end; procedure TBassInterfaceLayer.Stop(whichone: Byte; Fadeouttime: Byte); var Th: TFadeoutThread; begin if _Threadruns = true then exit; if whichone = 1 then begin if assigned(_internBass1) then begin (* Fade out needs to operate in another thread! *) if _Threadruns = false then begin _indiFadeouttime := Fadeouttime; // create Thread (suspended) Th := TFadeoutThread.Create(True); // Thread releases itself Th.FreeOnTerminate := True; // start Thread Th.Resume; end; end; exit; end; end; konkret geht´s darum:
Delphi-Quellcode:
_ThTimer1.OnTimer := _ThTimer1Event; // hier wird der Eventhandler angehängt
Delphi-Quellcode:
procedure TFadeoutThread._ThTimer1Event(Sender: TObject); begin _ThTimer1.Enabled := false; // leider aber nie ausgeführt freeandnil(_internBass1); end; ._ThTimer1Event wird nicht ausgeführt, obwohl Code für diesen Teil generiert wird. Kann mir jemand erklären warum? (das Code generiert wurde denke ich daran zu erkennen, weil Breakpoints an der Stelle möglich sind) Danke schonmal Padavan |
Re: Ereignishandler an Thread anhängen geht nicht
Zitat:
Dein eigentliches Problem dürfte wohl darin liegen, dass Du hier dem Timer ein Routine zuweist, die zu einem Thread gehört. Der Thread wird beim Beenden freigeben und endet vor Aufruf des Timers... Gruß Der Unwissende |
Re: Ereignishandler an Thread anhängen geht nicht
Danke erst mal!
Zitat:
Mein eigentliches Problem wollte ich damit umgehen, und hab mir damit das nächste eingehandelt. Eigentlich sah die Sache so aus:
Delphi-Quellcode:
wenn ich im Thread dieses
procedure TFadeoutThread.Fadeout;
begin _Threadruns := true; try if _activeBass = 1 then begin while _internBass1.Channel[0].Volume > 0 do begin _internBass1.Channel[0].Volume := _internBass1.Channel[0].Volume - 1; sleep(_indiFadeouttime); end; // hier gibt´s Probleme freeandnil(_internBass1); end; except if _activeBass = 1 then freeandnil(_internBass1); if _activeBass = 2 then freeandnil(_internBass2); Terminate; _Threadruns := false; end; // end Thread Terminate; _Threadruns := false; end;
Delphi-Quellcode:
ausführe, stürzt das Programm ab, mit der Meldung "ungültiges Fensterhandle"
freeandnil(_internBass1);
Darauf konnte ich mir nun gar keinen Reim machen. Ich sollte das Konzept mit dem Thread wahrscheinlich noch mal komplett überdenken. Padavan |
DP-Maintenance
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Hier gehts um Delphi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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