/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Brug TWindowsMediaPlayer i tråd
Fra : Harald


Dato : 27-01-06 19:31

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.

/HK



 
 
Brian Andersen \(www~ (30-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 30-01-06 07:44

Jeg vil tro, at problemet med din tråd skyldes, at den ikke er noget message
loop. Dette skal til for at Windows Media Playeren kan modtage Messages fra
Windows. Prøv at implementere din Threads Execure methode som nedenstående.
Dog har jeg sat et par kommentarer i din Execute methode.


Din kode...:

procedure TWMPThread.Execute;
begin
// OleInitialize(nil);
CoInitialize(nil); <--- Skrives i Thread.Create methoden.
WMP:=TWindowsMediaPlayer.Create(nil); <--- Skrives i Thread.Create
methoden.
WMP.URL:=pURL; <--- Skrives i Thread.Create methoden.
WMP.settings.volume:=100; <--- Skrives i Thread.Create methoden.

WMP.controls.play;

while not terminated do
Sleep(200);

WMP.settings.mute:=true; <--- Flyttes til Done Event'et
WMP.Free; <--- Flyttes til Done Event'et
end;



Min kode...:

constructor TWMPThread.Create(...
begin
inherited;
...
...
FreeOnTerminate := True;
OnTerminate := Done;

CoInitialize(nil);
FWMP := TWindowsMediaPlayer.Create(nil);
FWMP.URL := pURL;
FWMP.Settings.Volume := 100;

end;

procedure TWMPThread.Done;
begin
FWMP.settings.mute:=true;
FWMP.Free;
end;

procedure TWMPThread.Execute;
var
Msg: TMsg;
begin
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);

try
WMP.controls.play;

while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
except
on E: Exception do
raise; {Implementer eventuelt noget error handling}
end;
end;

Prøv det af. Gi' lige besked om det virker.


/Brian




Harald (30-01-2006)
Kommentar
Fra : Harald


Dato : 30-01-06 20:49

"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:HyiDf.5744$Cl2.134062@news000.worldonline.dk...
> Jeg vil tro, at problemet med din tråd skyldes, at den ikke er noget
> message
> loop. Dette skal til for at Windows Media Playeren kan modtage Messages
> fra Windows. Prøv at implementere din Threads Execure methode som
> nedenstående. Dog har jeg sat et par kommentarer i din Execute methode.
>

<klip en stak kode>

jo musikken starter men tråden kommer aldrig længere end til:
while GetMessage(Msg, 0, 0, 0) do

hvordan får jeg tråden afsluttet, normalt bruger jeg bare Terminate i hoved
tråden men det virker ikke her?
Jeg fand ud af i går at dette også virker fint:

while not terminated do
begin
Application.ProcessMessages;
Sleep(200);
end;

men det er nok ikke den helt rigtige måde at gøre det på, jeg har så lige
lavet dette som også virker fint, jeg kan terminate og jeg kan modtage
beskeder fra min hoved tråd som jeg sender med PostThreadMessage.

procedure TWMPThread.Execute;
var
Msg: TMsg;
begin
try
FWMP.controls.play;

while not terminated do
begin
MessageLoop;
Sleep(100);
end;
except
on E: Exception do
raise; {Implementer eventuelt noget error handling}
end;
end;

min MessageLoop ser således ud:

procedure TWMPThread.MessageLoop;
var
Msg : TMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
if Msg.message=WM_ThreadMessage then
begin
if Msg.wParam=1 then
beep;// Synchronize(HentModulListe);

if Msg.wParam=2 then
beep;// ModtagCmdFraMain:=true;
end;
end;
end;

WM_ThreadMessage er sat til WM_User+1; jeg bruger så en værdi i wParam til
at fortælle tråden hvad den skal foretage sig, f.eks. mute media playeren
osv.

Men du har vel nogle bemærkninger til det

/HK



Harald (30-01-2006)
Kommentar
Fra : Harald


Dato : 30-01-06 21:08

"Harald" <nomail@noname.dk> skrev i en meddelelse
news:43de6dac$0$84018$edfadb0f@dtext01.news.tele.dk...
> "Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
> meddelelse news:HyiDf.5744$Cl2.134062@news000.worldonline.dk...
>> Jeg vil tro, at problemet med din tråd skyldes, at den ikke er noget
>> message
>> loop. Dette skal til for at Windows Media Playeren kan modtage Messages
>> fra Windows. Prøv at implementere din Threads Execure methode som
>> nedenstående. Dog har jeg sat et par kommentarer i din Execute methode.
>>
>
> <klip en masse>

Glem alt, den sidste løsning jeg kom med virker alligevel ikke det er
åbenbart et spørgsmål om hvor disse linier befinder sig:
CoInitialize(nil);
FWMP := TWindowsMediaPlayer.Create(nil);
FWMP.URL := pURL;

var de i Create så virker det, er de i Execute så virker det ikke. Men med
din løsning så virker det ligemeget hvor de 3 linier befinder sig, og jeg
vil helst have dem i Execute. Så jeg vil arbejde videre med dit forslag.

/HK




Brian Andersen \(www~ (31-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 31-01-06 09:13

Prøv følgende:

while (not Terminated) and (GetMessage(Msg, 0, 0, 0)) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;

/Brian



Harald (31-01-2006)
Kommentar
Fra : Harald


Dato : 31-01-06 09:51

"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:5YEDf.5846$Cl2.134269@news000.worldonline.dk...
> Prøv følgende:
>
> while (not Terminated) and (GetMessage(Msg, 0, 0, 0)) do
> begin
> TranslateMessage(Msg);
> DispatchMessage(Msg);
> end;

Det virker fint, tak for det. Det er det her program jeg er i gang med:
www.kroning.dk > Radio player

problemet er at programmet "hænger" en gang i mellem når TMediaPlayer skal
starte/stoppe men det problem er så løst med næste version hvor TMediaPlayer
kører i egen tråd.

/HK



Brian Andersen \(www~ (31-01-2006)
Kommentar
Fra : Brian Andersen \(www~


Dato : 31-01-06 10:19

Godt at høre, at jeg kunne være til hjælp...

/Brian



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste