我回来了另一个关于线程和同步的问题。想象一个服务器应用程序必须执行一个冗长的操作,而客户端希望他的 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 锁定不起作用?
我现在无法更好地解释它。我希望有人明白我的意思。如果没有,请随时提出问题。
编辑:对于按钮的禁用和启用:我对客户端代码一无所知。可能是按钮事件处理程序,也可能是其他东西。基本上我想隐藏客户端代码的锁定。