gpt4 book ai didi

multithreading - 当控件被销毁时我应该什么时候停止线程(TCustomControl 后代)

转载 作者:行者123 更新时间:2023-12-03 18:23:05 25 4
gpt4 key购买 nike

我的 TCustomControl 后代使用线程,这涉及使用 InvalidateRect 进行无效化。我遇到这样的情况:当线程正在工作时关闭程序时,我不会停止 Destroy 中的线程,因为即使在进入组件 Destroy 的第一行之前(我通常在其中发出信号并等待线程停止工作),线程中的代码使程序可能在处理请求时显示异常“控制...没有父窗口”。

最佳答案

所有窗口交互 - 例如对 InvalidateRect 的调用 - 都应该在主线程中完成,因此将其从支持线程同步到主线程或摆脱额外的线程。

其次,当一个控件被销毁时,您不能再使用它的窗口句柄,因为它可能已经消失了。在这种情况下,VCL 将尝试再次重新创建句柄,尽管控件正在被破坏,从而导致各种错误。如果您显然或必须具有可能在控件销毁期间调用的绘图指令,请将此检查放在该代码周围:

if not (csDestroying in ComponentState) then

这段代码当然也必须在主线程中! (不是因为窗口句柄已经被销毁,而是因为 VCL 不是线程安全的)。这是暗示的,因为后面的代码 - 绘画 - (现在)也在主线程中。

关于multithreading - 当控件被销毁时我应该什么时候停止线程(TCustomControl 后代),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14051544/

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