Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是不是;“长时间运行方法已完成”;你有设计模式吗?_Delphi_Design Patterns - Fatal编程技术网

Delphi 是不是;“长时间运行方法已完成”;你有设计模式吗?

Delphi 是不是;“长时间运行方法已完成”;你有设计模式吗?,delphi,design-patterns,Delphi,Design Patterns,我有一个需要很长时间才能完成的方法,并希望定期检查是否完成。这就是我想到的(简化代码,Delphi 2007): 在上下文中,调用isDone实际上可能会执行部分要执行的操作,并在完成时返回true,而在仍有部分要执行时返回false。或者,它可以只检查另一个线程是否完成了它的工作。我不想让打电话的人看到这个 我想我不是第一个遇到这种问题的人,这个解决方案可能已经有了一个名称(设计模式?),但我找不到它。 那么它叫什么呢?微软为长时间运行的方法建议了两种模式(异步调用和根据模式会合) 我以

我有一个需要很长时间才能完成的方法,并希望定期检查是否完成。这就是我想到的(简化代码,Delphi 2007):

在上下文中,调用isDone实际上可能会执行部分要执行的操作,并在完成时返回true,而在仍有部分要执行时返回false。或者,它可以只检查另一个线程是否完成了它的工作。我不想让打电话的人看到这个

我想我不是第一个遇到这种问题的人,这个解决方案可能已经有了一个名称(设计模式?),但我找不到它。
那么它叫什么呢?

微软为长时间运行的方法建议了两种模式(异步调用和根据模式会合)


我以前见过这种情况被称为“未来”

以下是几个链接:

这是Oren Eini写的,他是一位多产的.Net开发人员。另外,如果您对编码模式、最佳实践等感兴趣,那么很值得阅读他的博客(此链接来自何处)

这个链接是你的,但我想我应该用它来更新答案


我不确定这是否对您有帮助/适合,但请看一下这个单元。

我不确定我是否正确理解您的问题,但我不喜欢在IsDone函数中完成部分实际工作的想法(有趣的句子)。我希望这样的方法只是检查一些标志并快速返回。如果我决定不继续调用IsDone,而是执行一些其他工作并在之后检查IsDone,该怎么办?然后,在第一次调用之前没有做任何工作-这与我对异步调用的期望不符


我没有真正回答你的问题,但我怀疑这是一种广泛使用的设计模式。

是的,但这又有什么关系呢?我认为OP可能不是在寻找替代解决方案,而是在寻找他特定解决方案的名称。在我目前的情况下,长时间运行的代码只是向硬件发送一些命令并等待答案。答案在不同的线程中异步到达。因此,我选择在IsDone调用中实际发送命令,并检查答案是否已到达。好的,在这种情况下,它实际上并不是长时间运行的代码,它只是需要永远的时间来完成,而不需要做很多事情。在这种情况下,使用一些IPC机制是过分的。有趣的参考。我发现了一个关于这个概念的描述。(HM,UNI SB?那可能是萨尔布鲁克大学吗?我得查一下。)谢谢链接傻瓜书。我会用它和我找到的另一个链接来更新我的答案,我想这就是我听到它叫“未来优先”的地方。有趣的是,我提到的那个人指的是你的链接。
type
  IWaitForDone = interface
    function IsDone: boolean;
  end;

function TSomeClass.doSomethingThatTakesLong: IWaitForDone;
begin
  Result := TClassThatDoesIt.Create;
end;

var
  Waiter: IWaitForDone;
begin
   Waiter := SomeClass.doSomethingThatTakesLong;
   while not Waiter.isDone do
     doSomethingElse;
   Waiter := nil;
end;