小编Mat*_*hou的帖子

Delphi中线程的概念方法

2 多年前,Remy Lebeau给了我关于 Delphi 线程的宝贵提示。他的回答对我很有用,我觉得我在他的帮助下取得了很大的进步。这篇文章可以在这里找到。

今天,我现在面临一个关于线程的“概念问题”。这与代码无关,而是与针对某个问题应该选择的方法有关。我知道我们不应该征求个人意见,我只是问,从技术角度来看,这些方法中的一种是否必须避免,或者它们是否都可行。

我的应用程序在数据库中有一个唯一产品编号(命名为 SKU)的列表。使用这些 SKUS 查询 API,我得到一个 JSON 文件,其中包含有关这些产品的详细信息。处理此 JSON 文件并将结果显示在屏幕上,并保存在数据库中。因此,在一个步骤中,涉及下载过程并在工作线程中执行。

我看到整个过程可能有两种不同的方法:

  1. 当用户单击开始按钮时,将触发查询,根据用户条件构建 SKU 列表。然后构建一个 Tstringlist,对于列表的每个元素,启动一个线程,下载 JSON,将结果发送回主线程并终止。

这可以被描绘成这样:

在此处输入图片说明

  1. 当用户单击开始按钮时,将触发查询,根据用户条件构建 SKU 列表。不是将 SKU 编号一个接一个地发送给工作线程,而是发送整个列表,工作线程遍历列表,将显示和保存的结果发送回主线程(通过同步事件)。所以我们只有一个工作线程在终止之前处理整个列表。

这可以被描绘成这样:

在此处输入图片说明

我对这两种不同的方法进行了编码,它们都有效……我所经历的每一种方法都有其缺点。

我不是专业的开发人员,这是一种爱好,在我进一步走上一条或另一条“抛光”之路之前,我想知道,从技术角度并根据您的知识和经验,我描述的方法应该避免以及为什么。

谢谢你的时间

马蒂亚斯

delphi iteration multithreading

5
推荐指数
1
解决办法
167
查看次数

图像通过线程错误下载

所有StackOverFlow会员和读者新年快乐!

今天我来找你一个关于Delphi中线程的问题(我浏览了大部分已经在主题上发布但未找到线索的内容).

我有一个非常简单的测试应用程序,其中包含一个Form(frmIMGDown)和一个线程单元.在表格上找到了

  • 一个Tbutton
  • 一个TImage
  • 一个TprogressBar

单击时,该按钮将启动一个从Web下载图像的线程,在此过程中更新进度条并在Timage中显示下载的图像.

只要调用Form(frmIMGDown)是主应用程序表单,或者如果从另一个表单调用它,但所有表单都是在应用程序启动时创建的,那么这种方法很好.

现在,如果我从按钮动态创建frmIMGDown,请单击主窗体上的:

procedure TForm1.Button2Click(Sender: TObject);
var
  frmIMGDown : TfrmIMGDown;
begin
  try
    frmIMGDown := TfrmIMGDown.Create(nil);
    frmIMGDown.ShowModal;
  finally
    frmIMGDown.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我收到了地址错误的访问冲突

如果我改变

frmIMGDown := TfrmIMGDown.Create(nil);
Run Code Online (Sandbox Code Playgroud)

frmIMGDown := TfrmIMGDown.Create(Form1);
Run Code Online (Sandbox Code Playgroud)

结果与相同的错误相同.

我怀疑这与我实现的线程有关,也许是使用的变量,我尝试发送回frmIMGDown,但我找不到解决方案.

这是线程单位:

unit unit_MyThread;

interface

uses
  Classes, IdHTTP, VCL.Forms, SyStem.UITypes, SysUtils, VCL.Dialogs, Graphics, IdTCPClient, IdTCPConnection, IdComponent,IdBaseComponent;

type
  TIdHTTPThread = class(TThread)
  private
    FURL : String;
    idHTTP: TIdHTTP;
    B : TBitMap;
    W : TWICImage;
    //MS : TMemoryStream;
  public
    Constructor Create(CreateSuspended: …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading progress-bar

4
推荐指数
1
解决办法
169
查看次数

标签 统计

delphi ×2

multithreading ×2

iteration ×1

progress-bar ×1