多线程Delphi [关闭]

2024-01-06

我在delphi 中的多线程方面遇到问题。我有一个姓名列表(大约 2000 个姓名),我需要获取网站中每个姓名的一些数据。除了线程控制之外,我的系统运行良好。

我想创建 10 个线程,并且当某个线程终止时,创建另一个线程......直到列表末尾。

var
 Form1: TForm;
 tCount: Integer;  //threads count

implementation

type
 TCheck = class(TThread)
 public
  constructor Create(Name: string);
  destructor Destroy; Override;
 protected
  procedure Execute; Override;
 end;

 MainT = class(TThread)
 protected
  procedure Execute; Override;
 end;

destructor TCheck.Destroy;
begin
 Dec(tCount);
end;

procedure MainT.Execute;
var
 i: Integer;
 Load: TStringList;
begin
 Load:=TStringList.Create;
 Load.LoadFromFile('C:\mynames.txt');

 for i:= 0 to Load.Count -1 do
 begin

  if tCount = 10 then  //if we have 10 threads running...
  begin
   repeat
    Sleep(1);
   until tCount < 10;
  end;

  TCheck.Create(Load.Strings[i]);
  TCheck.Start;
  Inc(tCount);

 end;

end;  // end of procedure

好吧,我没有放置 TCheck.Constructor,因为问题是我检查创建的线程数的方法。我的意思是,我的软件就停止了,没有任何错误消息,有时检查 500 个名称,有时检查 150 个名称......

抱歉英语不好。


这是使用泛型的线程安全队列解决方案。

定义您想要的消费者线程数、队列深度,然后运行DoSomeJob来自线程的过程。

将使用字符串的工作定义为通用过程(在CaptureJob).

当队列为空时,消费者线程将被销毁。这DoSomeJob过程等待直到所有作业准备就绪。 您可以轻松地将其转变为通用工作池,重用线程而不破坏它们。工作项目的通用结构也使它们适合处理不同类型的工作。

请注意,此队列适用于 XE2 及更高版本。如果您使用的是较旧的 delphi 版本,请按照注释中的建议查找类似的线程安全队列。

uses
  Classes,SyncObjs,Generics.Collections;

Type
  TMyConsumerItem = class(TThread)
  private
    FQueue : TThreadedQueue<TProc>;
    FSignal : TCountDownEvent;
  protected
    procedure Execute; override;
  public
    constructor Create( aQueue : TThreadedQueue<TProc>; aSignal : TCountdownEvent);
  end;

constructor TMyConsumerItem.Create(aQueue: TThreadedQueue<TProc>);
begin
  Inherited Create(false);
  Self.FreeOnTerminate := true;
  FQueue := aQueue;
  FSignal := aSignal;
end;

procedure TMyConsumerItem.Execute;
var
  aProc : TProc;
begin
  try
    repeat
      FQueue.PopItem(aProc);
      if not Assigned(aProc) then
        break; // Drop this thread
      aProc();
    until Terminated;
  finally
    FSignal.Signal;
  end;
end;

procedure DoSomeJob(myListItems : TStringList);
const
  cThreadCount = 10;
  cMyQueueDepth = 100;
var
  i : Integer;
  aQueue : TThreadedQueue<TProc>;
  aCounter : TCountDownEvent;
  function CaptureJob( const aString : string) : TProc;
  begin
    Result :=
      procedure
      begin
        // Do some job with aString
      end;
  end;
begin
  aQueue := TThreadedQueue<TProc>.Create(cMyQueueDepth);
  aCounter := TCountDownEvent.Create(cThreadCount);
  try
    for i := 1 to cThreadCount do
      TMyConsumerItem.Create(aQueue,aCounter);
    for i := 0 to myListItems.Count-1 do begin
      aQueue.PushItem( CaptureJob( myListItems[i]));
    end;
  finally
    for i := 1 to cThreadCount do
      aQueue.PushItem(nil);
    aCounter.WaitFor;  // Wait for threads to finish
    aCounter.Free;
    aQueue.Free;
  end;
end;

NB:Ken 解释了为什么你的初始化和线程启动是错误的。该提案展示了一种更好的结构,可以以更通用的方式处理此类问题。

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

多线程Delphi [关闭] 的相关文章

  • 等待 .NET 线程启动的正确方法是什么?

    我在微软网站上的线程教程中阅读了以下内容 http msdn microsoft com en us library aa645740 v vs 71 aspx http msdn microsoft com en us library a
  • BlockingCollection.TakeFromAny 方法是否适合构建阻塞优先级队列?

    我需要建立一个阻塞优先级队列 我的预感是TakeFromAny https learn microsoft com en us dotnet api system collections concurrent blockingcollect
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • 以 png 格式剪辑幻灯片 (Delphi 2010)

    I have a filmstrip of images in png format like this 我想知道如何剪辑每个图像并将这些图像放入 TImageList 控件中 并始终保留透明度 EDIT 是的 在设计时 RRUZ 提到的技
  • Node.js 工作线程中的 I/O 性能

    下面是一个工作线程示例 在本地计算机上同步 I O 大约需要 600 毫秒 const fs require fs const isMainThread Worker parentPort workerData require worker
  • 不支持 STA 线程上多个句柄的 WaitAll

    为什么我会收到此错误消息 不支持 STA 线程上多个句柄的 WaitAll 我应该使用 STAThreadAttribute 属性吗 Update 不适用于 WPF 应用程序 笔记 错误位于 WaitHandle WaitAll doneE
  • CPU Relax 指令和 C++11 原语

    我注意到许多使用特定于操作系统的原语实现的无锁算法 例如所描述的自旋锁here http locklessinc com articles locks 使用 Linux 特定的原子原语 经常使用 cpurelax 指令 使用 GCC 可以通
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 为什么在读取字典时要锁定

    我对我正在阅读的一本关于线程的书 C 3 in a Nutshell 中的代码列表感到困惑 在 应用程序服务器中的线程安全 主题中 给出了以下代码作为 UserCache 的示例 static class UserCache static
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 查找Delphi项目中的所有编译错误

    我正在对我的 Delphi 项目进行一些重构 我希望能够做出改变 然后看看all项目中因该更改而中断的地方 类似于 Eclipse 列出项目的所有编译错误 在 Java 中 在 Delphi 中 我可以进行更改 然后重新编译我的项目 但编译
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • 创建具有特定权限的线程C++

    我有一个多线程应用程序 我想创建一个具有不同用户权限的线程 例如 多域管理员权限 但我找不到任何 Win32 APICreateThread要做到这一点 如何创建具有特定用户权限的线程 thanks 调用 CreateThread CREA
  • Python 中的错误? threading.Thread.start() 并不总是返回

    我有一个很小的 Python 脚本 在我看来 threading Thread start 表现出意外 因为它不会立即返回 在线程内我想调用一个方法boost python基于对象 不会立即返回 为此 我将对象 方法包装如下 import
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • std::this_thread::yield() 用法?

    有人可以提供现实生活中的例子吗std this thread yield 在C 应用程序中的用法 我在 std lock 的实现中使用了yield 在这里找到 http llvm org svn llvm project libcxx tr
  • 如何在pyspark中使用foreach接收器?

    我该如何使用foreach在 Python Spark 中 结构化流式传输可在输出上触发操作 query wordCounts writeStream outputMode update foreach func start def fun
  • 我们怎样才能防止 OpenX 阻塞页面加载?

    我们使用 OpenX 在许多网站上投放广告 但是 如果 OpenX 服务器出现问题 它会阻止这些站点上的页面加载 我宁愿让网站优雅地失败 即加载没有广告的页面 并在它们可用时填充它们 我们正在使用 OpenX单页调用 http www op
  • 如何从 Lua 中连接和查询 MySQL?

    如何使用 Lua 编程语言连接到 MySQL 数据库 如果存在一个好的 流行的图书馆 它是什么 最小工作示例LuaSQL https keplerproject github io luasql manual html 从 Lua 到 DB
  • 使用 H.264 的 FFmpeg 流式传输(带音频) - Red5 媒体服务器(Ubuntu 操作系统)

    我正在尝试使用 RTMP 将带有 FFmpeg 的网络摄像头流式传输到我的 Red5 服务器 我已经使用 FLV 格式通过以下行成功完成了此操作 ffmpeg f video4linux2 i dev video0 f flv rtmp l
  • 如何检查注释是否聚类(MKMarkerAnnotationView 和 Cluster)

    我正在尝试使用 ios11 中添加到地图视图的新功能 我正在使用圆形碰撞对所有 MKAnnotationView 进行聚类 但当注释聚类时我必须实时检查 我不知道该怎么做 编辑 2018 年 4 月 1 日 更多信息 当我选择注释时 我会在
  • 合并两个 Guava Multimap

    有没有办法在java 8中优雅地合并两个具有相同键值对的番石榴多重映射 我尝试使用 collect Multimaps toMultimap 但没有成功 有几种方法 这是我能找到的最干净的 list stream collect Array
  • 绑定套接字时为什么要将端口号转换为网络字节顺序?

    我遇到了这段代码 它出现在设置套接字的内部 define PORT xxxx struct sockaddr in self self sin family PF INET self sin port htons PORT 我知道我们需要将
  • 如何使用 Swift Playground 来显示带有绘图的 NSView?

    基本上我想在 NSView 的 Swift Playground 中测试图表绘制 这是我现在正在使用的 class CustomView NSView init frame NSRect super init frame frame ove
  • XML 命名空间和 DTD 验证

    我用 xml 和 dtd 制作了一些文档 我在 xml html 命名空间中使用来插入图像 但我可以使用 xmllint 验证我的文档 但我不知道为什么 validator 在第一行停止 XML 文件
  • Unique 不再使用键作为默认值

    我主要在 Mac 中使用 Rstudio 最近我不得不开始使用Windows 但是 我发现 unique 不根据键在 data table 中提供唯一行 这是一个例子 a c 2 3 3 3 3 5 6 7 b c a a f g a d
  • 如何避免在 CMake 安装步骤中删除 RPATH?

    我正在使用 CMake 开发一个 C 项目 在其中构建一个可执行文件foo使用共享库libbar 正在通过添加ExternalProject add 可执行文件build src foo在构建目录中工作得很好 但是 如果我跑make ins
  • 分配给用户时,Django Auth Token ValueError

    我目前正在遵循 Django 指南并使用接收器分配身份验证令牌 但是 以下内容返回错误 Cannot assign
  • 事件监听器的范围

    我已为此按钮添加了一个事件侦听器
  • 在 iOS 中将开源代码嵌入静态库的稳定方法?

    我正在制作一个静态库以供其他开发人员分发 换句话说 是一种API 我必须使用一堆开源库 例如SBJSON ASIHTTPRequest 我认为如果我在源代码级别将这些类嵌入到我的库中 将会产生名称冲突问题 据我所知 Objective C
  • 将 Bitstring(1 和 0 的字符串)转换为 numpy 数组

    我有一个包含 1 列的 pandas Dataframe 其中包含一串位 例如 100100101 我想将此字符串转换为 numpy 数组 我怎样才能做到这一点 EDIT Using features df bit apply lambda
  • Elasticsearch 集群中相同查询的不同结果

    我创建了一个具有 3 个节点 3 个分片和 2 个副本的 Elasticsearch 集群 当使用相同的数据命中相同的索引时 相同的查询会获取不同的结果 现在 结果基本上按 score 字段 desc 排序 我认为这是默认的排序方式 并且要
  • 将目录中的图像作为 Tensorflow 数据集加载

    我对 ML 比较陌生 对 TensorfFlow 也非常陌生 我花了很多时间学习 TensorFlow MINST 教程以及https github com tensorflow tensorflow tree master tensorf
  • emacs 中的 Command-T

    emacs 的 vim 中是否有类似 CommandT 的插件 我知道一些插件可以进行基于目录的补全 但是是否有一个插件可以在完整路径上进行匹配 一个例子 bar hello baz test hello foo hello lost ba
  • 多线程Delphi [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我在del