![]() |
Thread verursacht Fehler
Hallo Freunde :hi: ,
ich hab ja schonmal einen Thread zum Thema Thread (lol) aufgemacht, da war dann auch alles sahne, aber jetz hab ich in ein anderes Programm auch einen Thread (TSoundThread) eingebaut. Komischerweise meldet er mir einen Fehler, den ich nicht verstehe. Wahrscheinlich liegt das daran, dass ich von Threads immernoch zu wenig ahnung habe! Hier der Code:
Delphi-Quellcode:
und so wird der Thread generiert:
unit USoundThread;
interface uses Classes, MMSystem; type TSoundThread = class(TThread) protected procedure Execute; override; public { Public declarations } constructor Create(Pfad : string); end; implementation var SoundPfad : Pchar; <--------- wenn ich SoundPfad in die Private Declaration setze, kommt eine Access Violation, wenn dem etwas zugeordnet wird { TSoundThread } constructor TSoundThread.Create(Pfad : string); begin SoundPfad := pchar(Pfad); //hier kommt die AV mit SoundPfad in der P D FreeOnTerminate := true; //wenn SoundPfad ne globale Var ist, dann kommt die AV hier... inherited Create(false); end; procedure TSoundThread.Execute; begin { Place thread code here } sndPlaySound(SoundPfad,snd_loop); // kann man ne Wave noch anders inner schleife abspielen? //if terminated then break; // <--- das funktioniert nun nämlich nicht mehr... end; end.
Delphi-Quellcode:
MfG Lefko.
procedure TForm3.FormCreate(Sender: TObject);
var SoundThread : TSoundThread; begin ... //Musik starten if FileExists(ExtractFilePath(Paramstr(0)) + 'Optionen') then begin F := TInifile.Create(ExtractFilePath(Paramstr(0)) + 'Optionen'); if not F.ReadBool('Optionen','Background', true) then exit; end; Pfad := ExtractFilePath(Paramstr(0)) + 'Sound\Background.wav'; if FileExists(Pfad) then SoundThread.Create(Pfad); end; |
Re: Thread verursacht Fehler
Hi,
lass die Finger von den PChars. Das iss nur die Adresse eines Strings. Wenn Du darin die Adresse eines Parameters oder lokalen Variablen aufhebst, hast du nix davon ausser dem ungültigen Zeiger und der beobachteten AV. Also im Abschnitt private deines Threads eine lokale Variable vom String, dorthin im Konstruktor den Pfad kopieren und erst beim Abspielen auf PChar typecasten. Dann ist der String wenigstens da :) In der Execute Methode würde ich ja die klassiche Schleife vorschlagen
Code:
Grüsse Bernd
repeat
... until Terminated |
Re: Thread verursacht Fehler
Zitat:
|
Re: Thread verursacht Fehler
Das was Herr Ua meint, kannst du auch in meinem Threading Tutorial von meiner Seite nachlesen. Desweiteren empfiehlt es sich, den Thread im angehaltenen Zustan zu erzeugen, was hier gar nicht anders geht, alles nötige zu initialisieren, in diesem Fall, die public Varaible für den Thread und ihn dann mit Resume in den zuteilungsfähigen Zustand zu versetzen.
|
Re: Thread verursacht Fehler
Zitat:
Hier ein Beispiel mit einer einkompilierten WAV-Ressource mit der ID 1:
Delphi-Quellcode:
// Play sound
PlaySound(MakeIntResource(1), HInstance, SND_RESOURCE or SND_LOOP or SND_ASYNC); // [...] // Stop sound PlaySound(MakeIntResource(1), HInstance, SND_RESOURCE or SND_PURGE or SND_ASYNC or SND_NOWAIT); |
Re: Thread verursacht Fehler
Hi NicoDE,
Zitat:
über InterlockedIncrement etc gehandelt wird. Bernd |
Re: Thread verursacht Fehler
Zitat:
Code:
trotzdem glaube ich mich erinnern zu können, dass Kudzu auf einer seiner Sessions zu "Indy10" oder "Threads" auf der diesjährigen EKON (zumindest für D5) ebenfalls vor dem unbedachten Gebrauch gewarnt hat.
LOCK DEC [EAX-skew].StrRec.refCnt
Im "Indy In Detph" könne ich hierzu auf Anhieb nichts finden (zumal bei Indy ohnehin Wrapper für alle Basistypen verwendet werden). Leider habe ich die EKON-CD zZt nicht hier, aber irgendwo bei der TMREW-"Cow-Class" ;) müsste das in seinen Slides stehen... |
Re: Thread verursacht Fehler
Zitat:
Bernd |
Re: Thread verursacht Fehler
Hai,
ich verschiebe den Thread mit meiner Nase mal nach ...... ><((((°> *Sonstiges* Ist dort wohl besser aufgehoben. |
Re: Thread verursacht Fehler
Hallo Bernd,
(kam vor(?)letzte Woche) streng genommen warst Du bei der Session, die ich meine, auch nicht anwesend. Vielleicht grenzt das die Suche weiter ein? Heute Abend werde ich das noch einmal recherchieren. @Lefko: Um es noch einmal zusammenzufassen. Die solltest den Thread Supended kreieren, und vorerst UniqueString verwenden. Außerdem empfiehlt es sich, den Aufruf des geerben Konstruktors als erste Anweisung in der überschriebenen Implementierung aufzurufen. Abschließend im Konstruktor dann Resume aufrufen. |
Re: Thread verursacht Fehler
Leider war den EKON-Slides nichts zu entnehmen, weshalb ich Chad angeschrieben habe und erst jetzt seine Antwort posten kann, weil ich dieses WE (ausnahmsweise einmal) nicht im Bureau war ;)
Hier die Anwort: Zitat:
|
Re: Thread verursacht Fehler
Zitat:
ich hab jetzt all die Tipps eingebaut, aber trotzdem kommt es zu einer AV! hier der Text:
Delphi-Quellcode:
Was kann da noch zu Fehlern führen?!
unit USoundThread;
interface uses Classes, MMSystem; type TSoundThread = class(TThread) private SoundPfad : string; protected procedure Execute; override; public { Public declarations } constructor Create(Pfad : string); end; implementation { TSoundThread } constructor TSoundThread.Create(Pfad : string); begin inherited Create(true); UniqueString(Pfad); //Ab hier kommt die AV SoundPfad := Pfad; Resume; //FreeOnTerminate := true; end; procedure TSoundThread.Execute; begin { Place thread code here } sndPlaySound(PChar(SoundPfad), SND_ASYNC or SND_LOOP); //if terminated then break; end; end. MfG Lefko. |
Re: Thread verursacht Fehler
Keine Ahnung, was du da machst:
Delphi-Quellcode:
unit Unit2;
interface uses MMSystem, Classes; type TPlayWave = class(TThread) private { Private-Deklarationen } public FFilename: String; constructor Create(Filename: string); protected procedure Execute; override; end; implementation { TPlayWave } constructor TPlayWave.Create(Filename: String); begin Inherited create(True); FFilename := Filename; FreeOnTerminate := True; Resume; end; procedure TPlayWave.Execute; begin sndPlaySound(PChar(FFilename), SND_ASYNC); end; end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var WaveThread: TPlayWave; begin WaveThread := TPlayWave.Create(ExtractFilepath(Paramstr(0))+ 'Beeth5th.wav'); end; |
Re: Thread verursacht Fehler
Zitat:
Zitat:
|
Re: Thread verursacht Fehler [GELÖST]
Hi Luckie :hi: ,
hm, ich Pappnase hab den Thread nur falsch kreiert.... Delphi hat es zwar nicht als Error gekennzeichnet, aber es führte immer zu ner AV. statt SoundThread := TSoundThread.create(...) hab ich SoundThread.Create verwendet... :wall: Naja, so ist das als Noob :roll: Danke, MfG Lefko. PS: Da das Prog jetzt geht hab ich ein weiteres Problem festgestellt, zu dessen Beseitigung ich den Code eigentlich extra in den Thread verfrachtet hab... Ich will mit dem Thread eine Hintergrundmusik abspielen, und dann soll, wenn die Schlange einen Apfel frisst, auch ein Sound abgespielt werden. Wenn dieser abgespielt wird, wird der Hintergrundsound abgebrochen :( Eigentlich will ich zwei Musikdateien also gleichzeitig abspielen! (Hatte das auch mit einer 2. exe, die nur zum soundabspielen gestartet wurde, das war aber unpraktisch und sehr unelegant...) Was könnte ich noch machen, damit es funktioniert?!? |
Re: Thread verursacht Fehler
Hi,
über das vergessene 'T' und die resultierende AV bin ich in den letzten Monaten auch mehrmals gestolpert. mfg Rumpi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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