如何按需启动/停止Delphi监控线程?

2023-12-12

我一直在寻找一种方法来监视 Delphi 中的特定注册表更改。找一个solution在 about.com 上:

procedure TRegMonitorThread.Execute;
begin
  InitThread; // method omitted here
  while not Terminated do
  begin
    if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then
    begin
      fChangeData.RootKey := RootKey;
      fChangeData.Key := Key;
      SendMessage(Wnd, WM_REGCHANGE, RootKey, LongInt(PChar(Key)));
      ResetEvent(FEvent);

      RegNotifyChangeKeyValue(FReg.CurrentKey, 1, Filter, FEvent, 1);
    end;
  end;
end;

在我的应用程序中,我需要按需启动和停止该线程,但上面的代码不允许这样做。仅设置终止标志是不行的。

以某种方式告诉线程停止等待,然后释放它并在需要时创建一个新线程就足够了。我怎样才能改变这个代码来实现这个目标?


Use WaitForMultipleObjects()使用两个事件的数组而不是WaitForSingleObject()。向线程类添加手动重置事件,并在设置后向其发出信号Terminated to True。检查返回值,这两个事件中的哪一个已发出信号,并采取相应的行动。

Edit:

一些最小的 Delphi 2009 代码来演示这个想法。你必须添加SyncObjs到已用单位列表中,并添加

  fTerminateEvent: TEvent;

to the private线程类的部分。

constructor TTestThread.Create;
begin
  inherited Create(TRUE);
  fTerminateEvent := TEvent.Create(nil, True, False, '');
  // ...
  Resume;
end;

destructor TTestThread.Destroy;
begin
  fTerminateEvent.SetEvent;
  Terminate; // not necessary if you don't check Terminated in your code
  WaitFor;
  fTerminateEvent.Free;
  inherited;
end;

procedure TTestThread.Execute;
var
  Handles: array[0..1] of THandle;
begin
  Handles[0] := ...; // your event handle goes here
  Handles[1] := fTerminateEvent.Handle;
  while not Terminated do begin
    if WaitForMultipleObjects(2, @Handles[0], False, INFINITE) <> WAIT_OBJECT_0 then
      break;
    // ...
  end;
end;

您只需将问题中的代码添加到其中即可。只需尝试释放线程实例即可执行解除线程阻塞所需的一切操作(如果需要)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按需启动/停止Delphi监控线程? 的相关文章

  • IO 异常 - 读结束死 - 在此示例中导致它的原因以及如何修复它 - Java 中的多线程应用程序

    这是一扩大 https stackoverflow com questions 22180458 how to set boolean flag of thread 1 from thread 2 in java multithreadin
  • 如何使用多线程

    我有这个代码 import thread def print out m1 m2 print m1 print m2 print n for num in range 0 10 thread start new thread print o
  • Java 中的 LRU 缓存实现

    我看过下面的代码 我认为addElement方法的实现中有一个无用的while循环 它永远不应该有比 size 1 更多的元素 因为已经有一个写锁 那么为什么 addElement 方法会删除元素直到它达到这个条件 真的 while con
  • Core Audio 渲染线程和线程信号

    iOS 是否有任何类型的非常低级别的条件锁 不包括锁定 我正在寻找一种方法来从核心音频渲染线程内向等待线程发出信号 而不使用锁 我想知道是否可能存在像 Mach 系统调用这样的低级内容 现在我有一个核心音频线程 它使用非阻塞线程安全消息队列
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • Python GIL 防止多核机器中 CPU 使用率超过 100%?

    许多参考文献都说 Python GIL 降低了多核机器中多线程代码的性能 因为每个线程在执行之前都需要获取 GIL 换句话说 看起来GIL实际上是将多线程Python程序变成了单线程模式 例如 1 线程A获得GIL 执行一段时间 释放GIL
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • java中的负载均衡线程池的种类

    我正在寻找一个负载平衡的线程池 到目前为止还没有成功 不确定负载平衡是否是正确的措辞 让我解释一下我试图实现的目标 第1部分 我有 Jobs 有 8 到 10 个单一任务 在 6 核 CPU 上 我让 8 个线程并行处理此任务 这似乎提供了
  • Boost:如何创建一个线程以便可以控制它的所有标准输出、标准错误?

    我用 C 创建了一个 win32 控制台应用程序 我使用一些API 不是我的 我不能修改它的来源 它是这样写的 它会将一些信息写入控制台屏幕 而不询问 每次我调用它时 每秒 48 次 所以我想将它放入某个线程并限制其输出能力 但我需要得到当
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • C++11 非阻塞生产者/消费者

    我有一个 C 11 应用程序 其中有一个生成数据的高优先级线程和一个消耗数据的低优先级线程 在我的例子中 将其写入磁盘 我想确保高优先级生产者线程永远不会被阻塞 即它仅使用无锁算法 使用无锁队列 我可以从生产者线程将数据推送到队列 并从消费
  • 异步调用的任务限制?

    我有一个同步工作的 NET 4 5 WCF 客户端 我正在更新它以使用新的异步 等待功能来进行多个同时服务器调用以同时获取数据块 在结束之前 我担心同时运行的所有线程将使服务器饱和 更不用说明年升级到该角色时会终止我的 Azure 辅助角色
  • 从另一个线程调用线程中的方法,python

    如何实现线程之间的通信 我有一个线程在其中执行一些操作 然后我需要从位于主程序线程中的对象调用一个方法 并且该方法应该在主进程中执行 class Foo def help self pass class MyThread threading
  • 同步访问 Immutable Integer 对象

    代码片段 1 class RequestObject implements Runnable private static Integer nRequests 0 Override public void run synchronized
  • 运行单个 Java 线程的双核 CPU 利用率[重复]

    这个问题在这里已经有答案了 可能的重复 多线程 Java 应用程序能否很好地利用多核机器 https stackoverflow com questions 1649402 would a multithreaded java applic
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置

随机推荐