Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перестает обновляться TImage из потока 
:(
    Опции темы
TechnoMag
Дата 19.2.2016, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.3.2010

Репутация: нет
Всего: нет



Пишу плейер с использованием bass.dll, визуализацию звука взял из примеров bass с некоторыми упрощениями.

Обновление TImage происходит из потока. 
Проблема в том, что через какое-то время обновление TImage не происходит. Поток при этом работает, и никаких ошибок в лог не пишет (я здесь намеренно убрал строки логирования). TFFTData bass выдает без ошибок.
Интервал "замерзания" не предсказуем.
Использование BitBlt дает тот же эффект.
Пробовал рандомно рисовать прямоугольник без вызовов фнукций bass - тот же эффект.


Код

procedure TForm1.drawVisualEffect(const x, y, width, height: integer; {CanvasHandle:HWND}dCanvas: TCanvas); 
var
  Rect1:TRect;
begin
  //BitBlt(PaintBox1.Canvas.Handle, 0, 0, Width, Height, CanvasHandle, 0, 0, srccopy);
    Rect1 := Rect(x, y, width, height);
    Image1.Canvas.CopyRect(Rect1, dCanvas, Rect1);
end;

procedure TSpectrum.UpdateView;
begin
  if FVisual<>nil then
    FVisual.drawVisualEffect(0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas);
end;

procedure TSpectrum.Draw(FFTData : TFFTData; X, Y : Integer);
        var i, YPos : LongInt; YVal : Single;
       begin

          VisBuff.Canvas.Pen.Color := PenColor;

                     VisBuff.Canvas.Pen.Color := PenColor;
                     VisBuff.Canvas.Brush.Color := PenColor;
                     VisBuff.Canvas.Rectangle(0, 0, 10, Random(20));


          //BitBlt(FPaintBoxHandle, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy)
       end;

procedure TSpectrum.Execute;
var
  FFTFata : TFFTData;
begin
  inherited;
  while not Terminated do
  begin
     if Terminated then
         exit;
     
     if (FStream<>0) and
        (BASS_ChannelIsActive(FStream) = BASS_ACTIVE_PLAYING) then
     begin
        try
          BASS_ChannelGetData(FStream, @FFTFata, BASS_DATA_FFT1024);
          Draw(FFTFata, 0, 0);
          synchronize(UpdateView);
        except
          on E:Exception do
            TLogger.sendError('draw error: ' + E.messsage);
        end;
     end;
     sleep(200);
  end;
end;



PM MAIL ICQ   Вверх
Alexeis
Дата 19.2.2016, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



VisBuff это TBitMap? Вообще неоконные компоненты плохо подходят для отрисовки в динамике. Криво это работает. А с потоком еще сложнее. Перед отрисовкой в потоке нужно залочить канвас, чтобы графический дескриптор не уничтожили до окончания отрисовки. И в потоке нельзя делать ничего такого, что связанно с отсылкой сообщений окну. Этот момент не так очевиден, поскольку что делает VCL внутри так сразу не скажешь. Более типичен подход, когда вычисляют в дополнительном потоке, а рисуют в главном.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
TechnoMag
Дата 20.2.2016, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.3.2010

Репутация: нет
Всего: нет



Да, VisBuff - это TBitmap. А какой компонент тогда посоветуете?
Как можно было бы еще реализовать механизм визуализации? Видимо я не стой точки зрения смотрю....

Это сообщение отредактировал(а) TechnoMag - 20.2.2016, 16:05
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.