Delphi在回调中遇到GUI问题 我有一个C++视频处理DLL工作得很好,但是它的回调冻结了我的应用程序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;

Delphi在回调中遇到GUI问题 我有一个C++视频处理DLL工作得很好,但是它的回调冻结了我的应用程序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;,c++,delphi,callback,C++,Delphi,Callback,我试图在回调中放置一个匿名线程,但我总是得到线程创建错误,请问是否有任何修复/正确的方法,以便此CB不会冻结我的应用程序GUI 我建议在回调中更新一个原子变量,然后在计时器事件中更新进度条,每次显示刷新触发的次数不超过一次 procedure FramesDone_cb(pvfDone: Integer;var cancel:Boolean);cdecl; begin // CurrentProgress is an integer so can be updated atomically

我试图在回调中放置一个匿名线程,但我总是得到线程创建错误,请问是否有任何修复/正确的方法,以便此CB不会冻结我的应用程序GUI

我建议在回调中更新一个原子变量,然后在计时器事件中更新进度条,每次显示刷新触发的次数不超过一次

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;

这将从UI中解锁回调,避免进度条的过度更新。

你能告诉我们C++库中如何声明回调吗?不可能告诉你你的库的线程规则和模型是什么。只有了解该库的人才能这样做。非常感谢,即使在我的delphi应用程序中,回调也能起作用,唯一的问题是当progresbar更新其在此处的位置时,主GUI将被冻结。请尝试将消息发布到GUI。我建议使用原子变量保存进度,并在计时器事件中更新进度UI控件。更新显示器的频率不需要超过显示器的刷新率。还要确保在更新控件之前已取得进展,以避免不必要的重新绘制。