【问题标题】:How to use generics to create a thread class that returns different values如何使用泛型创建返回不同值的线程类
【发布时间】:2010-11-10 09:06:22
【问题描述】:

我承认,我从 Stack Overflow 中学到了很多东西。

在on this question 之后,我了解了如何制作一个返回整数的解耦后台线程类,我现在想知道如何使其更通用。

但是我需要如何改变它(“整数”是硬编码的)。我使用一个很长的类名只是为了演示:

type
  TSyncMethod = Procedure(ThreadResult: integer) of Object;
  TBackgroundThreadWithIntegerResult = class(TThread)
  private
    FResult: integer;

到通用的对应物?

【问题讨论】:

  • 小记:这是糟糕的设计。为什么仅仅因为你的工作代码的结果类型发生了变化,你就想创建一个新的线程类? TThread 的使用在这里是一个实现细节,所以你应该选择组合而不是继承。创建一个计算结果的通用类,并使其可以在调用线程、专用线程或池中的线程中执行。
  • 当然 TBackGroundThreadWithIntegerResult 不是最好的解决方案,这就是我考虑使用泛型的原因。这样,我不需要为每种类型的结果添加 TThread 的子类。事实是,结果总是与数据库查询相关,有时它可以返回一个整数,有时是一个字符串,有时是一个 TDataSet。所以线程所做的只是执行一个查询并将一个整数、一个字符串或一个 TDataSet 保存到结果中。无论如何,如何根据通用 T 类型分配结果我不清楚,这就是我对 Jens Mühlenhoff 的回答的评论。
  • @mghie 好的,但是由于我需要返回一个通用值,我该如何处理线程内的通用计算类?

标签: multithreading delphi generics delphi-2009


【解决方案1】:
type
  TBackgroundThreadWithGenericResult<T> = class(TThread)
  private
    FResult: T;
  public
    type
      TSyncMethod = Procedure(ThreadResult: T) of Object;

当然,您可以为泛型类型选择更详细的类型名称,然后选择T。为简单起见,我已将TSyncMethod 放入类中。

用法为TBackgroundThreadWithGenericResult&lt;Integer&gt;.Create(...)。

【讨论】:

  • 好的,谢谢。如果 TsyncMethod 在类内,我发现它也可以工作。我有一个问题:如何处理 Result 类型?在非通用示例中,它是查询的结果: FResult := FData.Query.Fields[0].asinteger; ...这在通用版本中如何翻译?我的意思是对于每个 我如何以通用方式设置结果?
  • @user193655:这有点棘手,在这种情况下我可能不会使用泛型并返回 FData.Query.Fields[0].Value(假设 Query 是 TDataSet 后代)作为Variant。
  • 但是如果我还需要返回一个 TDataset,这对于变体是不可能的。另一种方法是仅返回 TDataSet,因此如果是整数,我将从字段中提取整数。无论如何,这会强制处理数据集,即使它只需要一个整数。你能建议另一种方法吗?
  • 为了清楚起见,我想有 3 个选项:返回一个整数,一个字符串一个 TDataset 对象。
  • 你可以使用 Variant 来返回一个 TDataSet 对象。将Mode 属性添加到类并决定将什么放入FResult: Variant。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多