multithreading - TMonitor 同步/Application.ProcessMessages

标签 multithreading delphi 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;

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/

相关文章:

Java多线程同步问题?

php - 致命异常 : AsyncTask #1 and android. view.WindowLeaked

c# - 无法在设置某些类属性的方法中进行线程化

php - 创建从 PHP 到 Delphi 的应用程序打印队列

synchronization - 如何设置和运行 SymmetricDS 反向初始加载(从商店到公司)

postgresql - 插入后同步两个表

Java CountDownLatch 用于等待 JFrame 处理

delphi - 使用备用注册表项启动 Delphi

Delphi改变主菜单颜色

multithreading - Delphi MREW 实现对读者有利吗?