gpt4 book ai didi

delphi - 如何让线程继续在后台工作并在列表框中显示结果?

转载 作者:行者123 更新时间:2023-12-02 15:45:26 24 4
gpt4 key购买 nike

我必须开发一个程序来根据我给出的 Select 语句持续观察数据库中的值

监视的值可以随时更改,我的程序必须根据我给出的 select 语句的结果来感知更改

我想使用 TThread 来观察选择结果,因为我的系统还有其他功能,用户不仅需要观察值,还需要对其进行处理。

如何在Delphi XE2中使用TThread来做到这一点

正在使用 VCL...没有 .Net

问候。

最佳答案

[编辑]

改进了答案,现在线程连续运行并“继续观察值”。

让我们构建一个示例。

首先,创建新的 VCL 应用程序。在窗体上放置一个 TListBox 和两个 TButton 组件。您需要编写按钮单击处理程序并添加一个私有(private)方法。整个单元应如下所示:

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit2;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FCollector: TCollector;
procedure OnCollect(S: TStrings);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(FCollector) then Exit;
FCollector := TCollector.Create;
FCollector.OnCollect := Self.OnCollect;
FCollector.Start;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(FCollector) then Exit;
FCollector.Terminate;
FCollector := nil;
end;

procedure TForm1.OnCollect(S: TStrings);
begin
ListBox1.Items.AddStrings(S);
end;

end.

接下来我们应该添加线程,从菜单中选择:文件 -> 新单元并替换为代码:

单元单元2;

interface

uses
System.Classes;

type

TCollectEvent = procedure (S: TStrings) of object;

TCollector = class(TThread)
private
{ Private declarations }
FTick: THandle;
FItems: TStrings;
FOnCollect: TCollectEvent;
FInterval: Integer;
protected
procedure Execute; override;
procedure DoCollect;
public
constructor Create;
destructor Destroy; override;
procedure Terminate;
property Interval: Integer read FInterval write FInterval;
property OnCollect: TCollectEvent read FOnCollect write FOnCollect;
end;

implementation

uses Windows, SysUtils;

{ TCollector }

constructor TCollector.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
FInterval := 1000;
FTick := CreateEvent(nil, True, False, nil);
end;

destructor TCollector.Destroy;
begin
CloseHandle(FTick);
inherited;
end;

procedure TCollector.DoCollect;
begin
FOnCollect(FItems);
end;

procedure TCollector.Terminate;
begin
inherited;
SetEvent(FTick);
end;

procedure TCollector.Execute;
begin
while not Terminated do
begin
if WaitForSingleObject(FTick, FInterval) = WAIT_TIMEOUT then
begin
FItems := TStringList.Create;
try
// Collect here items
FItems.Add('Item ' + IntToStr(Random(100)));
Synchronize(DoCollect);
finally
FItems.Free;
end;
end;
end;
end;

end.

现在,当您按下 Button1 时,您将从组合中的线程中接收项目。按下 Button2 线程将停止执行。

您应该考虑:

  1. 设置Interval来监视值,默认为1000ms,参见interval属性;

  2. Execute 中及其相关的所有代码(包括数据库访问组件)都应该是线程保存的。

关于delphi - 如何让线程继续在后台工作并在列表框中显示结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11396234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com