Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хочу проиграть трек с помощью MMAudioPlayer1 в новом потоке (TTh) [D7, 2000]


XTD ©   (2007-06-14 16:34:00) 

Привет всем!

Хочу проиграть трек с помощью MMAudioPlayer1 в новом потоке:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, MPlayer, ToolWin, ComCtrls, Buttons, ExtCtrls, jpeg,
 ActnMan, ActnColorMaps, Gauges, MMObj, MMDIBCv, MMSpectr,
 MMDSPObj, MMConect, MMButton, MMLame, MMAudio, MMWPlay, MMAPlay, MMClrBtn,
 MMLEDS, MMPanel, MMEnvelp, MMDelay, MMScroll, MMBmpLst, MMBmpBtn, MMHook,
 MMFill, MMLight, MMSpGram, MMOscope, MMLevel, MMHTimer, MMLEDLbl, MMFFile,
 MMFFEdit, MMDesign;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   MMAudioPlayer1: TMMAudioPlayer;
   procedure ListBox1DblClick(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
 end;

var
 Form1: TForm1;
 NumTrek:Integer;

implementation

{$R *.dfm}

type
 TMyThread=class(TThread)
 private
   //
 protected
   procedure Execute; override;
 public
end;

//Pley в другом потоке
procedure TMyThread.Execute;
begin
 if form1.ListBox1.Items[form1.ListBox1.itemindex] <> '' then
 Begin
   NumTrek := form1.ListBox1.itemindex;
   form1.MMAudioPlayer1.LoadFromFile(form1.ListBox2.Items[form1.ListBox1.itemindex] );
   form1.MMAudioPlayer1.Play();
 End;
end;

{Проиграть трек из ЛистБокса по двойному клику в другом потоке}
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
 FS:=TMyThread.Create(false);
end;

Ошибок не выдает, трек не воспроизводится. Почему? Какие я сделал ошибки?
Буду благодарен за ответы...


sniknik   (2007-06-15 12:44:00) [1]

> Думаю, что в отдельном потоке проигрыванию не будет ничего мешать.
у тебя поток, как таковой не работает, просто запускает проигрывание и завершается т.к.
> метод Play выполняется асинхронно.
не говоря уж об прямых обращениях к форме из потока... нельзя так делать.

> Тут интересно почему возникает эта пауза в проигрывании?
а в "родных" демо к этим компонентам тоже пауза? тогда выкини их, или купи т.к. эта пауза может быть признаком "триальности" (тогда на сайте это должно быть отражено, по чему и можно принять решение)


Сергей М.   (2007-06-15 12:40:00) [2]


> интересно почему возникает эта пауза в проигрывании?
>


Телепатор подсказывает, что работа компонента тесно завязана с оконными сообщениями.


> при сворачивании окна плеера


Что при этом у тебя в программе происходит в части обработки сопутствующих событий/сообщений - это только тебе ведомо. Но пока вся эта обработка не будет выполнена, ни одно из оконных сообщений, в получении которых заинтересован заинтересован компонент, обработано компонентом не будет.


XTD   (2007-06-15 12:22:00) [3]

Думаю, что в отдельном потоке проигрыванию не будет ничего мешать.
Тут интересно почему возникает эта пауза в проигрывании?


Сергей М.   (2007-06-15 11:22:00) [4]


> Не найдя стандартного решения этой проблемы, решил использовать
> отдельный поток


А с чего ты взял, что вынос сабжа в доп.поток решит эту проблему ?


XTD   (2007-06-15 10:33:00) [5]

Да, документации маловато...
Собственно говоря, почему я решил проигрывать треки в отдельном потоке:
Потому что при сворачивании окна плеера (да и всех остальных окон Win), происходит пауза при проигрывании в 1 сек.. Не найдя стандартного решения этой проблемы, решил использовать отдельный поток.


Сергей М.   (2007-06-15 10:24:00) [6]


> могу поделится


Оно мне без надобности.
А вот тебе не мешало бы внимательно изучить док-цию к компоненту, если она есть. Если нет, то изучить исходники хотя бы в части упомянутого тобой метода. А если нет ни того ни другого, то настоятельно рекомендую выбросить такой компонент в мусор.


XTD   (2007-06-15 10:14:00) [7]

Это отдельная компонента, могу поделится, все рабочее и много чего интересного...


Сергей М.   (2007-06-15 10:03:00) [8]


> Если в procedure TMyThread.Execute; запустить какой нить
> цикл, то звук прорывается, но не надолго.


Значит метод Play выполняется асинхронно.

Где это чудо - TMMAudioPlayer - живет ?


XTD   (2007-06-15 09:53:00) [9]

Заметил такую странность:
Если в procedure TMyThread.Execute; запустить какой нить цикл, то звук прорывается, но не надолго.


Сергей М.   (2007-06-15 09:38:00) [10]

Обращение к визуальным VCL-контролам в доп.потоке недопустимо.

К тому же нет гарантий корректности работы метода TMMAudioPlayer.Play в доп.потоке - это следует уточнить в док-кии к классу TMMAudioPlayer


XTD   (2007-06-15 09:15:00) [11]

up


XTD   (2007-06-14 16:36:00) [12]

Да, еще это в приват в классе ТФорм:
FS:TThread;


Наверх

Титульная страница Поиск, карта сайта Написать письмо