TMonitor同步/ Application.ProcessMessages

jpf*_*ius 2 delphi multithreading synchronization delphi-2009 tmonitor

我回来了另一个关于线程和同步的问题.想象一下,服务器应用程序必须执行冗长的操作,并且客户端希望他的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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

All*_*uer 7

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