是否有原因导致单独的线程无法查询 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 ×1