2 多年前,Remy Lebeau给了我关于 Delphi 线程的宝贵提示。他的回答对我很有用,我觉得我在他的帮助下取得了很大的进步。这篇文章可以在这里找到。
今天,我现在面临一个关于线程的“概念问题”。这与代码无关,而是与针对某个问题应该选择的方法有关。我知道我们不应该征求个人意见,我只是问,从技术角度来看,这些方法中的一种是否必须避免,或者它们是否都可行。
我的应用程序在数据库中有一个唯一产品编号(命名为 SKU)的列表。使用这些 SKUS 查询 API,我得到一个 JSON 文件,其中包含有关这些产品的详细信息。处理此 JSON 文件并将结果显示在屏幕上,并保存在数据库中。因此,在一个步骤中,涉及下载过程并在工作线程中执行。
我看到整个过程可能有两种不同的方法:
这可以被描绘成这样:
这可以被描绘成这样:
我对这两种不同的方法进行了编码,它们都有效……我所经历的每一种方法都有其缺点。
我不是专业的开发人员,这是一种爱好,在我进一步走上一条或另一条“抛光”之路之前,我想知道,从技术角度并根据您的知识和经验,我描述的方法应该避免以及为什么。
谢谢你的时间
马蒂亚斯
所有StackOverFlow会员和读者新年快乐!
今天我来找你一个关于Delphi中线程的问题(我浏览了大部分已经在主题上发布但未找到线索的内容).
我有一个非常简单的测试应用程序,其中包含一个Form(frmIMGDown)和一个线程单元.在表格上找到了
单击时,该按钮将启动一个从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)