Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThread-Execute wird nicht ausgefürhrt warum ? (https://www.delphipraxis.net/26849-tthread-execute-wird-nicht-ausgefuerhrt-warum.html)

mimi 30. Jul 2004 10:38


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:
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.
problem ist:
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 !!!

sakura 30. Jul 2004 10:40

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
Wie wäre es mit :?:
Code:
procedure TSoundWihle.Execute;
begin
  [color=#ff0000]while not Terminated do begin[/color]
    onE;
  end;

end;
...:cat:...

mimi 30. Jul 2004 10:51

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
keine änderung habe ich bekomme jetzt dafür beim beenden eine fehlermeldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt BreakOut.exe ist eine Exception der Klasse EOSError aufgetreten. Meldung: 'Systemfehler. Code: 5.
Zugriff verweigert'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
das problem ist excute wird noch nicht mal ausgeüfhrt !!!

Tyrael Y. 30. Jul 2004 10:51

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?

mimi 30. Jul 2004 11:03

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
jetzt bekomme ich beim beenden:
Code:
---------------------------
Anwendungsfehler
---------------------------
Exception EAccessViolation in Modul BreakOut.exe bei 00000000.

Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.


---------------------------
OK  
---------------------------
diesen fehler !!!

sakura 30. Jul 2004 11:08

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
Zitat:

Zitat von mimi
keine änderung habe ich bekomme jetzt dafür beim beenden eine fehlermeldung:

Was Du so keine Änderung nennst ;)

Dein Problem ist, daß Du den Thread mit Deiner Anwendung syncronieseren musst. Suche dazu mal nach Hier im Forum suchenSynchronize

...:cat:...

mimi 30. Jul 2004 11:23

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

dizzy 30. Jul 2004 13:46

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

mimi 30. Jul 2004 14:10

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
ich habs jetzt so gemacht:
Delphi-Quellcode:
procedure TSoundWihle.Execute;
begin
  while not Terminated do begin
    Synchronize(onE);
  end;

end;
nur jetzt hängt sich das progamm auf, und spielt die musik einfach weiter ab, macht aber sonnst nichts mehr :(

dizzy 30. Jul 2004 14:31

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

mimi 30. Jul 2004 14:35

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
verstehe ich nicht ganz, wo deiner meinung nach sollte ich es machen ???

dizzy 30. Jul 2004 15:28

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:
procedure TMyThread.ClearLines;
begin
  Form1.Memo1.Lines.Clear;
end;
und in der Methode "onE" dann aufrufen mit:
Delphi-Quellcode:
procedure TMyThread.onE;
begin
.
.
  Synchronized(ClearLines); // an Stelle von Form1.Memo1.Lines.Clear;
.
.
end;
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.

Zeig doch wenn es noch nicht klar ist die "onE" - evtl. kann man's am konkreten Bsp. besser erklären.

:cheers:
dizzy

\\edits: Schlechtschreibdinger...

mimi 30. Jul 2004 15:54

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;

dizzy 30. Jul 2004 18:37

Re: TThread-Execute wird nicht ausgefürhrt warum ?
 
Delphi-Quellcode:
// 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;
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 :?.

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?

mimi 30. Jul 2004 19:13

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 19:48 Uhr.

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