在Delphi-2010中不推荐使用TThread.resume应该使用什么?

时间:2009-09-13 17:39:02

标签: delphi delphi-2010

在我的多线程应用程序中

我使用 TThread.suspend TThread.resume

自从将我的应用程序移至Delphi 2010后,我收到以下交战信息

[DCC警告] xxx.pas(277):W1000符号“恢复”已弃用

如果不推荐Resume应该使用什么?

编辑1:

我使用 Resume 命令启动线程 - 因为它是在我终止线程之前将'CreateSuspended'设置为True并 Suspend 创建的。

编辑2:

Here is a link the delphi 2010 manual

8 个答案:

答案 0 :(得分:26)

Charles如果你读过TThread类的代码,你会找到答案。

   TThread = class  
   private type  

..
..
..   
   public  
     constructor Create(CreateSuspended: Boolean);  
     destructor Destroy; override;  
     procedure AfterConstruction; override;  
     // This function is not intended to be used for thread synchronization.  
     procedure Resume; deprecated;  
     // Use Start after creating a suspended thread.  
     procedure Start;  
     // This function is not intended to be used for thread synchronization.  
     procedure Suspend; deprecated;  
     procedure Terminate;  

查看此链接 http://wings-of-wind.com/2009/08/28/rad-studio-2010-community-pulse-the-day-after-part-2/

修改

如果需要同步线程,可以使用基于TMutex,TEvent和关键部分的方案。

再见。

答案 1 :(得分:12)

使用TThread.Start代替.Resume

- EDIT-- 启动当然只能用于Delphi 2010(以及之后的推测),以启动一个已创建挂起的线程(之前您将使用Resume)。

不建议使用Resume / Suspend(或相应的WinAPI函数)进行线程同步。参见讨论here(看看Barry Kelly的评论)。

答案 2 :(得分:6)

TThread 类中,

暂停恢复可能会被破坏(如果你看一下你会看到的来源) Suspend方法直接无条件地将布尔值设置为指示的线程挂起状态,而不是从线程句柄上的执行计数更强大地获取此状态。具有讽刺意味的是, Resume 方法确实使用了这个更强大的指示符< em> update 暂停状态Boolean)。

这可能是他们被弃用的原因。这也是为什么我实现自己的类来封装具有更强大的挂起和恢复机制的Windows线程,以及在线程完成后重新启动的能力。

我不确定为什么他们的弃用与同步有关。暂停和恢复线程不一定与同步有关,虽然我可以看到它是如何的。有趣的是,.NET框架Thread类中的等效方法同样标记为已废弃。 w.r.t同步注释出现在Windows API文档中,用于线程暂停/恢复。

如果使用弃用的方法会让您感到紧张并且您仍希望暂停/恢复,则可以始终使用Windows API suspend and resume the thread by reference to it's handle

答案 3 :(得分:4)

线程行为控制代码应该位于线程过程中。使用适当的同步对象和相应的API调用来暂停/恢复线程执行。从外面做这是一种危险的做法。所以有决定对其进行诽谤。

答案 4 :(得分:4)

以防万一您想要做的就是摆脱编译器提示

(1)在启动线程时摆脱编译器提示......

替换

MyThread := TMyThread.Create(True);
MyThread.Resume;

MyThread := TMyThread.Create(True);
MyThread.Start;

(2)在停止线程时摆脱编译器提示......

替换

MyThread.Suspend;
MyThread.Terminate;

MyThread.Terminate;

根本没什么大不了的。小心尝试混淆

答案 5 :(得分:3)

您应该按如下方式创建线程:

constructor TSignalThread.Create;
begin
 // create event handle first!
  FEventHandle := CreateEvent(
          {security}      nil,
          {bManualReset}  true,
          {bInitialState} false,
          {name}          nil);
  FWaitTime := 10;
  inherited Create({CreateSuspended}false);
end;

这样就不需要调用Start了。

请参阅http://www.gerixsoft.com/blog/delphi/creating-threads,了解此代码的工作原理。

答案 6 :(得分:3)

使用

Suspended := False; // Resume;

Start;

答案 7 :(得分:2)

@mghie(有点晚了,我知道)

以madexcept等为例。如果您的应用程序崩溃并向用户显示错误报告,则表示该对话框等待使用输入。如果崩溃是由线程操作引起的(不一定是线程崩溃),如果你没有挂起线程,屏幕将填充错误报告对话框。

示例2:记录。由于任何特殊原因,我至少需要记录一些线程执行状态。这包括当前的堆栈跟踪。现在,正如您(应该)知道的那样,在线程运行时您不能这样做,因为在您收集有关它的信息期间,线程会继续执行操作,因此在您完成收集时,收集的信息将不一致。因此,您需要暂停该线程。

我可以继续讨论线程管理的实际例子。当然,这些不是你每天编程的事情,但至少第一个例子我确信很多人都在使用,即使你不知道它的内部。调试器?再次,你使用它们。 但实际上,在所有这些情况下,都不使用TThread,因为工作是在线程句柄上完成的。事实上,很难找到TThread暂停使用的有效示例。但总的来说,这是另一个故事。