Delphi проблем с GUI в обратном вызове - PullRequest
0 голосов
/ 06 января 2020

У меня DLL обработки видео C ++ работает очень хорошо, но ее обратный вызов замораживает мое приложение GUI; вот мой Delphi код:

procedure FramesDone_cb(pvfDone: Integer;var cancel:Boolean);cdecl;
begin
    // this callback is freezing the whole GUI
    Form1.ProgressBar1.Position := pvfDone;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
vp: VideoProcessor;
 begin
  vp := VideoProcessor_Create();
  VideoProcessor_SetFramesDone_cb(vp,FramesDone_cb);
end;

Я пытался поместить анонимный поток в обратный вызов, но я всегда получаю Ошибка создания потока , пожалуйста, есть ли какое-нибудь исправление / правильный способ, чтобы этот CB не останавливает мое приложение GUI.

1 Ответ

1 голос
/ 06 января 2020

Я бы предложил обновить переменную atomi c в вашем обратном вызове, а затем обновить индикатор выполнения в событии таймера, которое срабатывает не чаще, чем один раз за дисплей refre sh.

procedure FramesDone_cb(pvfDone: Integer;var cancel:Boolean);cdecl;
begin
   // CurrentProgress is an integer so can be updated atomically
   CurrentProgress := pvfDone;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if ProgressBar1.Position != CurrentProgress then
     ProgressBar1.Position := CurrentProgress;
end;

Это разъединяет обратный вызов из пользовательского интерфейса и позволяет избежать чрезмерных обновлений индикатора выполнения.

...