Size: a a a

2020 September 21

AI

Alexander Ivanov in Delphi & Lazarus
destroy - не обнуляет переменную. Лучше использовать free.
источник

AI

Alexander Ivanov in Delphi & Lazarus
а еще лучше feeandnil
источник

RS

Renat Suleymanov in Delphi & Lazarus
Alexander Ivanov
destroy - не обнуляет переменную. Лучше использовать free.
Free Тоже не обнуляет
источник

S

Serjone in Delphi & Lazarus
Renat Suleymanov
Уничтожение должно остановить воспроизведение? Просто я не знаком с классом TMCIPlayer
да. Если запустить с кнопки, потом ещё раз нажать кнопку, то воспроизведение останавливается и зпускается сначала
источник

RS

Renat Suleymanov in Delphi & Lazarus
Alexander Ivanov
а еще лучше feeandnil
☝️
источник

AI

Alexander Ivanov in Delphi & Lazarus
Renat Suleymanov
Free Тоже не обнуляет
Само собой.
источник

S

Serjone in Delphi & Lazarus
Alexander Ivanov
а еще лучше feeandnil
не работает.
источник

S

Serjone in Delphi & Lazarus
Alexander Ivanov
destroy - не обнуляет переменную. Лучше использовать free.
в одном потоке оно нормально отрабатывает. Если запускать с кнопки на форме. А если из потока хттп сервера, то нет.
источник

S

Serjone in Delphi & Lazarus
procedure TFm.IdHTTPServer1CommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
 sParam: string;
begin
   PlaySound(sParam);
end;

end;
источник

S

Serjone in Delphi & Lazarus
вот при таком запуске, где создаётся переменная? как получается так, что она создаётся дважды? Как уничтожить именно ту, которая создалась в прошлый раз?
источник

GB

George Bakhtadze in Delphi & Lazarus
Serjone
вот при таком запуске, где создаётся переменная? как получается так, что она создаётся дважды? Как уничтожить именно ту, которая создалась в прошлый раз?
из другого потока может не быть видны еще измененения в первом. потому и запускается. используй крит. секции или потокобезопасные коллекции, как уже сказали
источник

RS

Renat Suleymanov in Delphi & Lazarus
Serjone
в одном потоке оно нормально отрабатывает. Если запускать с кнопки на форме. А если из потока хттп сервера, то нет.
Надо весь код смотреть. Если судить по твоему коду, то и не из одного потока такая процедура бы НЕ запускалась повторно. Возможно у тебя где-то в другом месте обнуляется эта переменная. Ну и вся конструкция, еще раз потворюсь, видно, что неправильная. По другому надо все
источник

AS

Alexey Shumkin in Delphi & Lazarus
Serjone
if mPlayer<>nil then
  begin
   mPlayer.Destroy;
  end
;
вот это разве не должно убивать плеер, если он уже запущен? как он создаётся второй раз?
if mPlayer<>nil then
  begin
   mPlayer.Destroy;
  end
;

во-первых,
Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy.
http://docwiki.embarcadero.com/Libraries/Rio/en/System.TObject.Destroy

во-вторых, это заменяется на FreeAndNil(mPlayer). почему - тут https://t.me/TFMXGods/215908 (ссылка на тред на эту же тему ))
источник

S

Serjone in Delphi & Lazarus
Alexey Shumkin
if mPlayer<>nil then
  begin
   mPlayer.Destroy;
  end
;

во-первых,
Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy.
http://docwiki.embarcadero.com/Libraries/Rio/en/System.TObject.Destroy

во-вторых, это заменяется на FreeAndNil(mPlayer). почему - тут https://t.me/TFMXGods/215908 (ссылка на тред на эту же тему ))
это я понял. Так будет правильнее, но это не решает проблемы.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Serjone
это я понял. Так будет правильнее, но это не решает проблемы.
ну, у тебя уже поспрашивали про глобальность mplayer )
я бы сделал, как предлагал Ренат:
объект "воспроизводитель треков"
у него - метод добавления  трека для воспроизведения
который уже внутри может останавливать (либо добавлять в очередь) текущее воспроизведение и начинать добавленное..
он же и контролирует управление mplayer (и жизненный цикл её)
не надо использовать глобальные переменные ))
источник

SB

Sergey Bodrov in Delphi & Lazarus
Вот готовый файл, умеет и одновременно несколько звуков воспроизводить, и поочереди, и как угодно. https://github.com/serbod/NovaLib/blob/master/MciPlay.pas
источник

S

Serjone in Delphi & Lazarus
George Bakhtadze
из другого потока может не быть видны еще измененения в первом. потому и запускается. используй крит. секции или потокобезопасные коллекции, как уже сказали
создаю критическую секцию, в обработчике сервера пишу
  CS.Enter;
   PlaySound(sParam);
   CS.Leave;
Как я понял, в момент ентер ни один другой поток не сможет сделать свой ентер в этот цс, верно?
источник

GB

George Bakhtadze in Delphi & Lazarus
Serjone
создаю критическую секцию, в обработчике сервера пишу
  CS.Enter;
   PlaySound(sParam);
   CS.Leave;
Как я понял, в момент ентер ни один другой поток не сможет сделать свой ентер в этот цс, верно?
да. но если это новая для тебя тема, то лучше почитать немного (или много). наскоком фигня получится скорее всего
источник

AS

Alexey Shumkin in Delphi & Lazarus
Serjone
создаю критическую секцию, в обработчике сервера пишу
  CS.Enter;
   PlaySound(sParam);
   CS.Leave;
Как я понял, в момент ентер ни один другой поток не сможет сделать свой ентер в этот цс, верно?
нуу.. это не совсем то, что подразумевалось ))
код в крит.секциях должен выполняться максимально  быстро ))
источник

S

Serjone in Delphi & Lazarus
George Bakhtadze
да. но если это новая для тебя тема, то лучше почитать немного (или много). наскоком фигня получится скорее всего
с одной стороны, так и получилось. Но тутдругой случай. Плейсаунд отрабатывает моментально, то есть запускает звук и происходит лив. При этом звук продолжает воспроизводиться. Проблема в том, что другое событие сервера не видит уже созданный объект и создаёт его заново
источник