gpt4 book ai didi

multithreading - TMonitor 同步/Application.ProcessMessages

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

我带着另一个关于线程和同步的问题回来了。想象一个服务器应用程序必须执行一个冗长的操作,并且客户端希望他的 GUI 在他等待服务器响应时保持响应。我想到了以下模式:

TMonitor.Enter (FTCPClient);
try
WorkerThread := TWorkerThread.Create (SomeLengthyServerOperation);
while (not WorkerThread.Ready) do
Application.ProcessMessages;
DoSometingWithResults (WorkerThread.Result);
WorkerThread.Free;
finally
TMonitor.Exit (FTCPClient);
end;

WorkerThread 是一个派生自 TThread 的简单类,它执行传递给其构造函数的函数,然后终止(Ready=True,结果在 Result 中)。只要单击按钮,就会执行所显示的代码。

现在回答我的问题:如果我非常快地单击按钮两次,我会收到一些奇怪的错误,这些错误看起来很像服务器和客户端之间的通信以某种方式混淆了,我想通过锁定 FTCPClient 对象来避免这种错误。 Application.ProcessMessages 执行后的事件处理程序在哪个线程中? TMonitor 的锁是按线程的吗?这是否意味着如果我使用 Application.ProcessMessages,锁不起作用?

我现在无法更好地解释它。我希望有人明白我的意思。如果没有,请随时提问。

编辑:对于按钮的禁用和启用:我对客户端代码一无所知。可以是按钮事件处理程序,也可以是其他东西。基本上我想对客户端代码隐藏锁定。

最佳答案

TMonitor 只阻止不同的 线程获取锁。发生的事情是这样的:通过处理来自锁内的消息,您将返回到同一线程中的同一函数,这会导致递归获取锁。然后您的代码将创建一个新的工作线程,并重新开始整个循环。您可以禁用该按钮,以便在工作线程完成之前无法再次单击它。确保在开始处理消息之前禁用按钮,并使用另一个 try..finally block 以确保它被重新启用。根据其余代码的安排方式,您甚至可能不需要锁。

关于multithreading - TMonitor 同步/Application.ProcessMessages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/570052/

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