Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sprachausgabe in Thread (https://www.delphipraxis.net/203541-sprachausgabe-thread.html)

iphi 27. Feb 2020 09:19

Delphi-Version: 7

Sprachausgabe in Thread
 
Hallo,

ich versuche einen Thread zu schreiben, der einen String per Sprachausgabe ausgibt, aber ich bekomme beim Aufruf die EOIeException "CoInitialize wurde nicht aufgerufen", obwohl ich das explizit aufrufe.

Hier mein Thread-Code:
Delphi-Quellcode:
unit UThreadSpeak;

interface

uses
  Classes, ComObj, SysUtils, ActiveX;

type
  TSpeak = class(TThread)
  private
    { Private declarations }
    txt: string;
    stimme: Olevariant;
    destructor Destroy; override;
  protected
    procedure Execute; override;
  public
    constructor Create(text: string);
  end;

implementation

{ TSpeak }

constructor TSpeak.Create(text: string);
begin
inherited Create(true);
txt:=text;
FreeOnTerminate:=true;
CoInitialize(nil);
Stimme:=CreateOleObject('SAPI.SpVoice');
Suspended:=false;
end;

destructor TSpeak.Destroy;
begin
CoUninitialize;
inherited destroy;
end;

procedure TSpeak.Execute;
begin
  Stimme.speak(txt);
end;

end.

BerndS 27. Feb 2020 09:23

AW: Sprachausgabe in Thread
 
Ich würde es mal so versuchen.
Code:
procedure TSpeak.Execute;
begin
  CoInitialize(nil);
  try
    Stimme.speak(txt);
  finally
    CoUninitialize;
  end;
end;

Der schöne Günther 27. Feb 2020 09:27

AW: Sprachausgabe in Thread
 
Genau das. Setz dir doch einfach mal einen Haltepunkt im Debugger - Dann siehst du nur Execute auch wirklich das ist was im Thread ausgeführt wird. Create nicht, das wird natürlich im Kontext des Threads ausgeführt der Create auch aufruft.

iphi 27. Feb 2020 09:29

AW: Sprachausgabe in Thread
 
Danke, alles klar! :-D

himitsu 27. Feb 2020 09:48

AW: Sprachausgabe in Thread
 
Jupp, Create ist noch im startenden Thread und Destroy ... mal hier und mal da. (entsprechend FreeOnTerminate)
Nur Execute läuft im Thread und was "nur" in den Thread gehört, gehört auch nur dort rein.

Delphi-Quellcode:
inherited Create(true);
//und
Suspended:=false;
Brauchst nicht.
Wenn Suspended, dann wird der Thread sowieso erst im AfterCreate gestartet, also immer erst nach dem Create.
Delphi-Quellcode:
inherited Create(False);
reicht also.

Rollo62 27. Feb 2020 10:20

AW: Sprachausgabe in Thread
 
Schonmal das versucht ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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