Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread verursacht Fehler (https://www.delphipraxis.net/11801-thread-verursacht-fehler.html)

choose 17. Nov 2003 07:53

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:

:: My Question: Do you know about any problems that occur using the
:: default Delphi strings in a multithreaded environment without
:: these wrapper classes? (I believe you said that...)

Yes. You cannot access an unprotected string in ANY Delphi version, but D4 (And I think 5 and maybe even 6) did not have protection in the reference count areas.

Lefko 17. Nov 2003 21:16

Re: Thread verursacht Fehler
 
Zitat:

Zitat von choose
@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.

Hi,
ich hab jetzt all die Tipps eingebaut, aber trotzdem kommt es zu einer AV!

hier der Text:

Delphi-Quellcode:
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.
Was kann da noch zu Fehlern führen?!

MfG Lefko.

Luckie 17. Nov 2003 21:30

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;

NicoDE 17. Nov 2003 21:39

Re: Thread verursacht Fehler
 
Zitat:

Zitat von Lefko
Delphi-Quellcode:
constructor TSoundThread.Create(Pfad : string);
begin
  inherited Create(true);
  UniqueString(Pfad);        //Ab hier kommt die AV
  SoundPfad := Pfad;
  Resume;
  //FreeOnTerminate := true;
end;

Es sollte: UniqueString(SoundPfad) heißen und nach der Zuweisung stehen.
Zitat:

Zitat von Lefko
Delphi-Quellcode:
procedure TSoundThread.Execute;
begin
  { Place thread code here }
  sndPlaySound(PChar(SoundPfad), SND_ASYNC or SND_LOOP);
  //if terminated then break;
end;

SND_ASYNC sorgt dafür, dass PlaySound() sofort zurückkehrt und der Sound im Hintergrund abgespielt wird (genau das, was Du willst). Dadurch ist der gesamte Aufwand - es in einen eigenen Thread zu packen - überflüssig.

Lefko 17. Nov 2003 21:42

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?!?

Rumpi 17. Nov 2003 22:47

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 19:14 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz