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

Cha*_*iga 35 delphi delphi-2010

在我的多线程应用程序中

我使用TThread.suspendTThread.resume

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

[DCC警告] xxx.pas(277):不推荐使用W1000符号'Resume'

如果弃用Resume应该使用什么?

编辑1:

我使用Resume命令启动线程 - 因为它创建时将'CreateSuspended'设置为True并在终止线程之前挂起.

编辑2:

这是delphi 2010手册的链接

RRU*_*RUZ 28

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;  
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

再见.

  • 这很好,除了我想知道我们实际需要编写什么代码? (14认同)
  • 链接不起作用。现在它的内容在 http://windwings.wordpress.com/2009/08/28/rad-studio-2010-community-pulse-the-day-after-part-2/ (2认同)

Phi*_*hiS 13

使用TThread.Start而不是.Resume

--EDIT--开始当然只能用于Delphi 2010(以及后来,大概是)用来启动一个被挂起的线程(之前你曾经使用过Resume).

不建议使用Resume/Suspend(或相应的WinAPI函数)进行线程同步.请参阅此处的讨论(请参阅Barry Kelly的评论).

  • 只有在您(可能)使用旧版Delphi的开发人员不共享源代码时,Start才能替换Resume.imho Suspend应该已被弃用并且已经足够*继续记录*.例如"Resume旨在用于激活在初始挂起状态下创建的线程.一旦线程开始运行,就不应该使用Suspend和Resume来管理线程的执行状态.更好的是,Suspend应该已经修复(如果它还没有)并且没有弃用,但是已经制定了一些不错的文档. (8认同)
  • +1 Deltics.这是一种悲伤,令人遗憾的事态.什么是一个废话TThread. (6认同)
  • 不是答案,真的 - 使用`Suspend()`和`Resume()`进行"同步"已被弃用,没有任何替换.自Delphi 2时代以来,已经有了适当的同步对象.现在,这些不合理的方法已经被弃用了. (3认同)

Del*_*ics 7

SuspendResume曾经(或曾经)在TThread类中被破坏(如果查看源代码,您将看到Suspend方法直接无条件地将布尔值设置为指示的线程挂起状态,而不是更强大地从该状态导出此状态线程句柄上的执行计数.具有讽刺意味的是,Resume方法确实使用这个更健壮的指标来更新暂停状态Boolean).

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

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

如果使用弃用方法会让您感到紧张并且您仍希望暂停/恢复,则可以始终使用Windows API 通过引用它的句柄暂停和恢复该线程.

  • 一个错误imho.暂停和恢复线程是合法的操作.这不是做某些事情的正确方法,但解释如何/何时正确使用某些东西是文档的用途.而不是弃用并希望人们会简单地停止使用这些方法(依赖模糊的"不要使用这些方法进行同步"和谷歌帮助人们理解为什么)他们应该:1)修复了Suspend的实现2)正确记录了预期使用的方法.然后由开发人员决定是否使用它们. (7认同)
  • CodeGear/Embarcadero弃用Suspend但确实没有引入替代品,这真的很臭. (4认同)
  • 这里有关于暂停/恢复的讨论:http://forums.codegear.com/message.jspa?messageID = 3466特别是看看Barry Kelly的评论.底线是你不应该触摸Suspend或WinAPI SuspendThread函数,Resume应该只用于启动创建挂起的线程.Suspend/Resume不应用于线程同步. (3认同)

Sam*_*Sam 5

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

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

更换

MyThread := TMyThread.Create(True);
MyThread.Resume;
Run Code Online (Sandbox Code Playgroud)

MyThread := TMyThread.Create(True);
MyThread.Start;
Run Code Online (Sandbox Code Playgroud)

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

更换

MyThread.Suspend;
MyThread.Terminate;
Run Code Online (Sandbox Code Playgroud)

MyThread.Terminate;
Run Code Online (Sandbox Code Playgroud)

没什么大不了的。提防混淆