Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.06.2012, 22:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию SetTimer и TimeSetEvent

Собственно задачу я решил, но вопрос остался. При использовании мультимедийного таймера (TimeSetEvent), загрузка файла не происходит
Код HTML:
procedure OnTimer(uTimerID, uMsg, dwUser, dw1, dw2 : Integer); stdcall; begin ... Sound.LoadFromFile(Name); ... end; ... Sound := TSound.Create; Timer := TimeSetEvent(500, 1, @OnTimer, 0, TIME_PERIODIC);

через обычный таймер всё нормально
Код HTML:
procedure OnTimer(Wnd : HWND; Msg, idEvent, dwTime : Longint); stdcall; begin ... Sound.LoadFromFile(Name); ... end; ... Sound := TSound.Create; SetTimer(Wnd, 1, 500, @OnTimer);

здесь происходит загрузка файла
Код HTML:
procedure TSound.LoadFromFile(Name : String); var WideName : array[0..MAX_PATH - 1] of WideChar; begin if Name = '' then Exit; MultiByteToWideChar(CP_ACP, 0, PChar(Name), -1, WideName, MAX_PATH); if FAILED(pLoader.LoadObjectFromFile(CLSID_DirectMusicSegment, IID_IDirectMusicSegment8, WideName, pSegment)) then Exit; ...
Так и не понял причину такого поведения.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 01.06.2012 в 23:49.
Ответить с цитированием
  #2  
Старый 01.06.2012, 23:34
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

может быть колдунство здесь
Код HTML:
procedure ChangeBkMusicTimer (uTimerID, uMsg, dwUser, dw1, dw2 : Integer); stdcall; ... Timer := TimeSetEvent(500, 1, @OnTimer, 0, TIME_PERIODIC);

таймеру передается одна процедура (OnTimer), а загрузка файла происходит в другой (ChangeBkMusicTimer )
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #3  
Старый 01.06.2012, 23:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Да это я забыл здесь исправить.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 02.06.2012, 00:19
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

пальцем в небо......
может разрешение (аргумент UINT uResolution) уж очень слишком мал, что-то там не так синхронизируется с потоком таймера при попытке загрузки файла
больше мыслей нет

З.Ы. при обнаружении причины такого поведения просьба отписаться....интересно ведь
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #5  
Старый 02.06.2012, 00:26
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Не знаю, но при включении TimeSetEvent в класс TSound:
Код HTML:
procedure OnTimer(uTimerID, uMsg, dwUser, dw1, dw2 : Integer); stdcall; begin ... TSound(dwUser).LoadFromFile(Name); ... end; constructor TSound.Create; begin fTimer := TimeSetEvent(500, 1, @OnTimer, DWORD(Self), TIME_PERIODIC); end;
файл грузится. Хотя, судя по отладчику, разницы при вызовах я не увидел.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 02.06.2012, 21:46
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Судя по всему, проблема в том, что мультимедийный таймер работает в собственном потоке и интерфейсу DirectX это ооочень не нравится. Сделал как предлагает справка: из процедуры таймера посылаю сообщение главному окну с нужными мне параметрами, а уже оно производит загрузку и воспроизведение файла.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter