![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
По данному примеру в главном потоке все работает http://www.delphisources.ru/forum/sh...ad.php?t=19786
Создаю в потоке Переменную типа TMCIPlayer, при вызове Play ничего не происходит. Как решить? |
|
#2
|
||||
|
||||
|
А что такое TMCIPlayer ?
|
|
#3
|
|||
|
|||
|
Цитата:
Код:
uses
MMSystem,
type
TMCIPlayer = class
private
FDeviceID: Cardinal;
public
constructor Create(FileName: String);
destructor Destroy; override;
procedure Play;
procedure Stop;
end;
{ TMCIPlayer }
constructor TMCIPlayer.Create(FileName: String);
var
OpenParms: TMCI_Open_Parms;
FFlags: Longint;
FError: Longint;
Buffer: array [0..$ff] of Char;
begin
inherited Create;
OpenParms.dwCallback:=0;
OpenParms.wDeviceID:=0;
OpenParms.lpstrDeviceType:='';
OpenParms.lpstrElementName:=PChar(FileName);
OpenParms.lpstrAlias:=PChar(IntToStr(GetTickCount)+#0);
FFlags:=MCI_WAIT or MCI_OPEN_ELEMENT or MCI_OPEN_ALIAS;
FError:=mciSendCommand(0, MCI_OPEN, FFlags, Longint(@OpenParms));
if FError=0 then FDeviceID:=OpenParms.wDeviceID
else
begin
FDeviceID:=0;
mciGetErrorString(FError, @Buffer[0], Length(Buffer));
ShowMessage(StrPas(@Buffer[0]));
end;
end;
destructor TMCIPlayer.Destroy;
var
GenericParms: TMCI_Generic_Parms;
FFlags: Longint;
begin
if FDeviceID<>0 then
begin
GenericParms.dwCallback:=0;
FFlags:=MCI_WAIT;
if mciSendCommand(FDeviceID, MCI_CLOSE, FFlags, Longint(@GenericParms))=0 then
FDeviceID:=0;
end;
inherited Destroy;
end;
procedure TMCIPlayer.Play;
var
PlayParms: TMCI_Play_Parms;
FFlags: Longint;
begin
if FDeviceID<>0 then
begin
FFlags:=MCI_NOTIFY;
PlayParms.dwCallback:=0;
PlayParms.dwFrom:=0;
PlayParms.dwTo:=0;
mciSendCommand(FDeviceID, MCI_PLAY, FFlags, Longint(@PlayParms));
end;
end;
procedure TMCIPlayer.Stop;
var
GenericParms: TMCI_Generic_Parms;
FFlags: Longint;
begin
if FDeviceID<>0 then
begin
FFlags:=MCI_WAIT;
GenericParms.dwCallback:=0;
mciSendCommand(FDeviceID, MCI_STOP, FFlags, Longint(@GenericParms));
end;
end;Ну и собственно, в конструкторе потока Код:
Asound:= TMCIPlayer.Create('d:\Alert.mp3'); |
|
#4
|
||||
|
||||
|
Команды Open и Play посылай в одном потоке.
|
|
#5
|
|||
|
|||
|
Цитата:
Код:
type
TWait = class(TThread)
private
....
Asound: TMCIPlayer;
....
constructor TWait.Create(doLog:Boolean=False );
begin
inherited Create;
....
Asound:= TMCIPlayer.Create('d:\Alert.mp3')
end;
procedure TWait.OnHiLite(RepeatAgain, HiLite: boolean);
begin
if RepeatAgain then
.....
if HiLite then
begin
// Synchronize(Alert);
Asound.Play
end;
end;
|
|
#6
|
||||
|
||||
|
Execute нет. А зачем вообще тут поток, звук и так асинхронно воспроизводится.
|
|
#7
|
|||
|
|||
|
Цитата:
Ну да, через Syncronize вызывается,но не удобно т.к событие отсчитывается в потоке, там бы и хотелось вызвать. |
|
#8
|
|||
|
|||
|
Цитата:
|
|
#9
|
||||
|
||||
|
В dwCallback передается Handle окна, которому приходят MM_MCINOTIFY. Поток не нужен для ММ.
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
nixon232 (12.12.2016)
| ||