gpt4 book ai didi

Delphi类参数

转载 作者:行者123 更新时间:2023-12-02 05:54:41 24 4
gpt4 key购买 nike

我正在尝试在 Delphi 中编写我自己的 ThreadManager 单元,到目前为止我已经做到了:

unit uThreadManager;

interface

uses
Classes,
Windows;

type
TCustomTThread = class (TThread)
public
TaskData : Pointer;
end;

type
TWorkerThread = class(TObject)
private
TaskDataList : TList;
TaskDataListCrit : TRTLCriticalSection;
function ReadTotalTasks : Integer;
public
constructor Create;
destructor Destroy; override;
property TotalTasks : Integer read ReadTotalTasks;
function AddTask(Thread: TCustomTThread; Data: Pointer) : Integer;
procedure Delete (Index : Integer);
end;

implementation

type
PTaskData = ^TTaskData;
TTaskData = record
Thread : TCustomTThread;
TaskPointer : Pointer;
end;

procedure TWorkerThread.Delete(Index: Integer);
var
TaskData : PTaskData;
begin
EnterCriticalSection(TaskDataListCrit);
TaskData := TaskDataList.Items[Index];
TaskDataList.Delete(Index);
LeaveCriticalSection(TaskDataListCrit);
TaskData^.Thread.Free;
Dispose(TaskData);
end;

function TWorkerThread.ReadTotalTasks;
begin
EnterCriticalSection(TaskDataListCrit);
result := TaskDataList.Count;
LeaveCriticalSection(TaskDataListCrit);
end;

destructor TWorkerThread.Destroy;
begin
DeleteCriticalSection(TaskDataListCrit);
TaskDataList.Free;
inherited;
end;

constructor TWorkerThread.Create;
begin
inherited;
InitializeCriticalSection(TaskDataListCrit);
TaskDataList := TList.Create;
end;

function TWorkerThread.AddTask(Thread: TCustomTThread; Data: Pointer) : Integer;
var
NewTask : PTaskData;
begin
EnterCriticalSection(TaskDataListCrit);
New(NewTask);
// I would like to create a new instance of TCustomTThread here!
//NewTask^.Thread := ...
NewTask^.TaskPointer := Data;
result := TaskDataList.Add (NewTask);
LeaveCriticalSection(TaskDataListCrit);
end;

end.

我在 AddTask 过程中遇到了参数问题...

这是我正在尝试做的事情的示例:

unit Unit2;

interface

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

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

type
TTheCustomThread = class (TCustomTThread)
public
procedure Execute; override;
end;

implementation

{$R *.dfm}

procedure TTheCustomThread.Execute;
begin
// My Code
end;

procedure TForm2.Button1Click(Sender: TObject);
var
NewWorkerThread : TWorkerThread;
begin
NewWorkerThread := TWorkerThread.Create;
NewWorkerThread.AddTask(TTheCustomThread, NIL);
end;

end.

这段代码给了我错误:

[dcc32 Error] Unit2.pas(42): E2010 Incompatible types: 'TCustomTThread' and 'class of TTheCustomThread'

我可以通过在堆栈中声明一个新的 TTheCustomThread var 来解决此问题,但我想避免这种情况,因为以后我根本不需要它,并且 AddTask 将创建 TTheCustomThread 的新实例。我可以使用 TClass,然后类型转换为 TCustomThread 但我想知道是否还有其他方法可以完成这项工作。

感谢您的帮助。

最佳答案

您的函数AddTask定义如下:

function AddTask(Thread: TCustomTThread; Data: Pointer) : Integer;  

您传递的第一个参数的类型为TCustomTThread。这是 TCustomTThread实例

您可以这样调用该函数:

AddTask(TTheCustomThread, nil);

在这里您传递的是类而不是实例。因此会出现编译器错误。

现在看来,你想做的就是通过类(class)。在 AddTask 中,您希望接收一个类,然后创建一个新实例。像这样声明一个类类型:

type
TTheCustomThreadClass = class of TTheCustomThread;

更改 AddTask 以接收该类型:

function AddTask(ThreadClass: TCustomTThreadClass; Data: Pointer) : Integer;  

在实现中,创建一个如下所示的实例:

NewTask^.Thread := ThreadClass.Create;

您很可能希望将 TTheCustomThread 的构造函数声明为虚拟的,以允许派生类自由定义可以从工厂创建机制执行的构造函数。

关于Delphi类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20012177/

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