gpt4 book ai didi

multithreading - TThread.Synchronize 在 Delphi 2009 中导致(接近)死锁(在 Delphi 7 中工作)

转载 作者:行者123 更新时间:2023-12-03 15:42:28 29 4
gpt4 key购买 nike

在 Delphi 2009 中,在 Delphi 7 中运行良好的同步函数执行速度极其缓慢,直到您在打开的窗体上移动鼠标为止。摆动鼠标会导致程序进入某种鼠标空闲状态,从而执行 CheckSynchronize()CheckSynchronize() 在 Delphi 2009 中的调用频率似乎低于在 Delphi 7 中的频率,但我们无法弄清楚原因或位置。

放置此代码:

    procedure TMyForm.FormCreate(Sender : TObject)
Classes.WakeMainThread := WakeMainThread;
end;

procedure TMyForm.WakeMainThread(Sender: TObject);
begin
SendMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
end;

以正常速度加快速度。但是,如果在模态应用程序中使用线程,则当线程终止时,我会得到: EAccessViolation in module rtl120.bpl (对于简单的对话框实用程序来说效果很好)。我猜测“Classes.WakeMainThread()”的调用次数与 Delphi 7 中的调用次数一样多,但是将 WM_NULL 发送到 application.handle 并没有完成任何操作。我想是时候“迈出步伐”了。

最佳答案

Synchronize() 机制的内部结构在 D7 和 D2009 之间没有太大变化。当然,添加了新功能(异步队列、匿名方法等),但在主线程中运行代码的核心实现没有改变。更可能发生的情况是主线程代​​码中尚未显示的其他内容正在阻止主线程正确处理待处理消息和 Synchronize() 请求。

关于multithreading - TThread.Synchronize 在 Delphi 2009 中导致(接近)死锁(在 Delphi 7 中工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742954/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com