Entwickler-Ecke

Windows API - TThread Problem


Mephisto090 - Sa 02.01.10 21:50
Titel: TThread Problem
hi,

Kurz und Knapp:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
// Aufbau Des THreads
type
  TSpeak = class(TThread)
  private
    FText: String;
    FVoice: OLEVariant;
  protected
    procedure Execute; override;
  public
    constructor Create(Text: String);
  end;


// Das Diese Computerstimme was Vorliest
procedure TSpeak.Execute;
begin
  FVoice:= CreateOLEObject('SAPI.SpVoice');
  FVoice.Speak(FText, 0);
end;


// Create vom Thread
constructor TSpeak.Create(Text: String);
begin
  inherited Create(false);
  FText:= Text;
  FreeOnTerminate:=True;
end;

// Thread Createn
procedure TForm1.btn1Click(Sender: TObject);
begin
  th:= TSpeak.Create('Hello');
end;


Diese beiden fehler bekomme ich:

Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EOleSysError mit Meldung 'CoInitialize wurde nicht aufgerufen'. Prozess Project1.exe (2224)

Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EOleSysError mit Meldung 'CoInitialize wurde nicht aufgerufen, ProgID: "SAPI.SpVoice"'. Prozess Project1.exe (2224)

Bitte um Hilfe danke
Mfg Mephi


Flamefire - Sa 02.01.10 21:59

1 Minute bei google:
hier [http://209.85.129.132/search?q=cache:DFfLCYrwZh8J:forum.delphi-treff.de/showthread.php%3Fp%3D173801+CreateOLEObject%28%27SAPI.SpVoice%27%29+CoInitialize&cd=2&hl=de&ct=clnk&gl=de&client=firefox-a]


Mephisto090 - Sa 02.01.10 22:10

so soweit klappt das ja schon das ich die Form auf wenn er sprich bewegen kann bloß ich habe das jetzt ine ine klasse gemacht und er sagt nix mehr

danke schonmal soweit

Edit mir ist aufgefallen das ich die Var: 'oleVoice: OLEVariant;' nicht Local setzen darf sondern Privat


Narses - So 03.01.10 14:33

Moin!

In jedem Thread-Context ist ein eigenes CoInitialize erforderlich, deshalb könnte das so klappen: :idea:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Das Diese Computerstimme was Vorliest
procedure TSpeak.Execute;
begin
  CoInitialize(NIL);
  FVoice:= CreateOLEObject('SAPI.SpVoice');
  FVoice.Speak(FText, 0); // unterstellt, dass diese Methode blockiert
  CoUnInitialize;
end;
cu
Narses