小编uke*_*ded的帖子

从单独的线程访问 TMediaPlayer.Position

是否有原因导致单独的线程无法查询 TMediaPlayer 对象的 Position 属性?

我编写了一个 Delphi DLL,它是带有 TMediaPlayer 组件的表单。应用程序定期调用 DLL,这些 DLL 调用可以查询 DLL 表单上 TMediaPlayer 对象的 Position 和 Length 值:

procedure TDLLForm.SongPosUpdate();
var
  new_pos: integer;
  new_len: integer;
begin
  new_pos := AudioPlayer.Position;
  new_len := AudioPlayer.Length;
end;
Run Code Online (Sandbox Code Playgroud)

当在加载 DLL 的应用程序上下文中调用时,上述函数可以正常工作。但是,如果 DLL 创建一个单独的线程(TThread 的子类)并且新线程调用相同的函数,则它会获得对象的 Position 和 Length 属性的无效值:

// TTimerThread: Constructor
constructor TTimerThread.Create(F: TDLLForm);
begin
  DllForm := F;
  inherited Create(True);
  inherited priority := tpHighest;
end;


// TTimerThread: Execute
procedure TTimerThread.Execute;
begin
  while not Terminated do
  begin
    DLLForm.SongPosUpdate();
    Sleep (1000);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

TMediaPlayer …

delphi

2
推荐指数
1
解决办法
541
查看次数

标签 统计

delphi ×1