Avatar billede kroning Nybegynder
27. januar 2006 - 18:07 Der er 20 kommentarer og
1 løsning

Brug TWindowsMediaPlayer i tråd

Jeg forsøger at få en TWindowsMediaPlayer, som er en importeret ActiveX control, til at virke i en tråd. Hvis jeg opretter en TWindowsMediaPlayer i min hoved tråd at runtime på samme måde som i tråden så virker det fint, men hvis jeg gør det i en tråd så sker der intet udover at den forsøger at forbinde.

her er min thread kode:

constructor TWMPThread.Create(URL : string);
begin
    inherited Create(False);
    FreeOnTerminate:=true;
  pURL:=URL;
end;

procedure TWMPThread.Execute;
begin
//    OleInitialize(nil);
    CoInitialize(nil);
    WMP:=TWindowsMediaPlayer.Create(nil);
    WMP.URL:=pURL;
  WMP.controls.play;
  WMP.settings.volume:=100;

  while not terminated do
      Sleep(200);

    WMP.settings.mute:=true;
    WMP.Free;
end;

som nævnt hvis jeg bruger disse 3 linier:
WMP:=TWindowsMediaPlayer.Create(nil);
WMP.URL:=pURL;
WMP.controls.play;

i min hoved form så virker det fint.
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 10:43 #1
jeg kan ikke helt gennemskue hvad koden gør, men er en timeout kontrol, i tilfælde hvis den valgte radio station er nede, så den ikke bliver ved med at skrive forbinder i al evighed? :-)
Avatar billede kroning Nybegynder
28. januar 2006 - 10:54 #2
Problemet er at den ikke afspiller stationen når jeg bruger TWindowsMediaPlayer i en tråd.
Avatar billede stoney Nybegynder
28. januar 2006 - 11:35 #3
while not terminated do
      Sleep(200);

"sleeper" den ikke hele tiden her

Stoney
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 11:47 #4
hmm, den var straks værre. kan du ikke maile mig hele koden? så vil jeg se hvad jeg kan gører :-)
Avatar billede kroning Nybegynder
28. januar 2006 - 12:02 #5
Der er så lidt kode i min test at det får du lige her, men jeg kan også maile det hele hvis du hellere vil have det. Men der er en form (Form1) med 2 knapper på (button1,button2).
Når man trykker på knap1 så oprettes en tråd men der afspilles intet? Når man trykker på knap2 så benyttes samme kode bare ikke i en tråd og så afspilles der uden problemer.

----

unit WMPTestUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WMPLib_TLB, ActiveX;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

    TWMPThread = class(TThread)
  private
    { Private declarations }
        WMP : TWindowsMediaPlayer;
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TWMPThread }

constructor TWMPThread.Create;
begin
    inherited Create(False);
    FreeOnTerminate:=true;
end;

procedure TWMPThread.Execute;
begin
    CoInitialize(nil);
    WMP:=TWindowsMediaPlayer.Create(nil);
    WMP.URL:='http://dix.media.webpartner.dk/voice128';
  WMP.controls.play;

  while not terminated do
      Sleep(200);

    WMP.Free;
end;
// ****************************** END Thread

procedure TForm1.Button1Click(Sender: TObject);
begin
// dette virker ikke
    with TWMPThread.Create do
        // ikke noget lige nu
end;

procedure TForm1.Button2Click(Sender: TObject);
var
    WMP : TWindowsMediaPlayer;
begin
// dette virker fint
    WMP:=TWindowsMediaPlayer.Create(nil);
    WMP.URL:='http://dix.media.webpartner.dk/voice128';
  WMP.controls.play;
end;

end.
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 12:15 #6
hvordan kan det være at du creater TWindowsMediaPlayer at runtime? :-)
Avatar billede kroning Nybegynder
28. januar 2006 - 12:16 #7
Det er jo den eneste måde når det skal køre i en tråd.
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 12:19 #8
nåh ja - godaw mand økseskaft :-), har siddet oppe det halve af natte og studeret.
Avatar billede kroning Nybegynder
28. januar 2006 - 12:23 #9
Stoney> "sleeper" den ikke hele tiden her

jo, men hvad skal man så skrive?
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 12:26 #10
det er while not terminated do
sleep(200) den er gal med... :)
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 12:27 #11
prøvede at fjerne den, det virker - ulempe, du får en fejl med privileged instruction
Avatar billede kroning Nybegynder
28. januar 2006 - 12:32 #12
Det virker ikke her og jeg får heller ikke nogen fejl.
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 12:36 #13
ups, jeg har skrvet forkert - ved din execute er der et problem med while not - do og sleep(200) - er ikke sikker men fejlen må ligge ved det NOT statement.... :-)
Avatar billede kroning Nybegynder
28. januar 2006 - 12:57 #14
Jeg fik din mail, nu må du ikke blive sur men har du arbejdet med tråde før, for din kode giver ingen mening?

-------------
while terminated do
    WMP.Free;
hvad skal det betyde?

------------
with TWMPThread.Create do
      Execute;
Da CreateSuspended er false kalder du Execure 2 gange og derfor får du en fejl

-------------
Der oprettes en TWindowsMediaPlayer i Execute men Execute afsluttes med det samme og tråden frigives da FreeOnTerminate er sat til true. Dvs. at du ikke længere kan få fat i tråden da den jo ikke længere findes og du har en TWindowsMediaPlayer der fiser rundt og afspiller som du ikke har kontakt til.
Avatar billede psycosoft-funware Nybegynder
28. januar 2006 - 14:25 #15
jeg er overhovedet ikke sur :-), undskyld hvis jeg har klokket rundt i det.... må vist hellere tage et par timer på sofaen, og kigge på det igen med friske øjne..... :-)
Avatar billede kroning Nybegynder
28. januar 2006 - 23:11 #16
Hvis jeg gør det sådan i tråden så virker det:

  while not terminated do
  begin
        Application.ProcessMessages;
      Sleep(200);
  end;
Avatar billede psycosoft-funware Nybegynder
29. januar 2006 - 09:17 #17
super :D
Avatar billede kroning Nybegynder
29. januar 2006 - 09:36 #18
Men jeg mangler så stadig et svar på hvordan man gør det på den rigtige måde.
Avatar billede stoney Nybegynder
29. januar 2006 - 10:53 #19
prøv

while not terminated do
  begin
      Sleep(200);
  end;
   
WMP.settings.mute:=true;
WMP.Free;

ellers muter du og free'er hele tiden.

IKKE TESTET

Stoney
Avatar billede kroning Nybegynder
29. januar 2006 - 11:02 #20
Jeg forstår ikke lige hvad du mener, det er jo det samme som min tidligere post?
Avatar billede kroning Nybegynder
04. februar 2006 - 09:30 #21
Så virker det, fik svar i en NG

    while (not Terminated) and (GetMessage(Msg, 0, 0, 0)) do
    begin
        MessageLoop(Msg);
        TranslateMessage(Msg);
        DispatchMessage(Msg);
    end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester