2010-11-17 68 views
8

在delphi XE我可以使用启动程序,但这种方法不存在德尔福2007年哪个是在delphi 2007中启动暂停线程的正确方法?

此示例代码工作正常在Delphi XE,使用开始

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Start; 

,但在2007年德尔福的start过程不存在,所以我使用的是在新版本的delphi中弃用的简历程序。

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Resume; 

所以quieon是,这是确定使用resume在Delphi 2007或我必须用另一种方式来启动一个暂停的线程?

在此先感谢。

回答

19

正确的方式开始暂停的线程是从来没有在第一时间被挂起的线程。

有更好的方法来创建线程。如果调用者必须为对象提供一个值才能使类正常工作,那么请不要将其设置为可选:将其作为参数提供给构造函数。如果该参数只有一个有效值,那么甚至不要将其作为参数:只需在构造函数中对其进行硬编码即可。 (?有多少次你写的,只有有时应该释放本身终止线程类我从来没有看到这一点。)

constructor TMyThread.Create(Prop1, Prop2: Integer); 
begin 
    inherited Create(False); 
    FreeOnTerminate := True; 
    Property1 := Prop1; 
    Property2 := Prop2; 
end; 

然后你可以使用创建线程的润·波普尔方法:刚设置它并忘记它!

MyThread := TMyThread.Create(900, 2); 

调用者没有创建后做的线程什么。而且由于它是一个free-on-terminate线程,所以调用者甚至可能根本不会保留对变量MyThread的引用,因为只要线程运行完毕,引用就会失效。

(担心那个inherited Create(False)行会创建一个线程,在构造函数的其余部分运行之前开始运行?不要!十多年前,Delphi 6已经修复了这个问题,线程将自动启动在构造函数完成后;请参阅TThread.AfterConstruction以了解如何。)

+1

+ Inf对于最后一段 – arthurprs 2012-02-08 16:33:47

+0

感谢您增加关于创建和执行顺序的信息。我总是开始暂停线程,并以这种确切的恐惧恢复它们。 – 2015-08-03 20:31:48

1

是的,这是旧的Delphi版本没有Start过程的正确方法。

1

在Delphi 2010及更新版本中不建议使用恢复和暂停。似乎基本上不鼓励使用它们进行线程同步。他们不是那个意思。

无论如何,如果你想要做的就是恢复一个被创建暂停的线程,那么在旧版本中调用Resume是安全的。

如果您需要在Delphi 2007和Delphi XE中使用相同的源代码,那么您可以使用条件编译来避免XE中的警告。

而且,看看这个问题,这是关系到你的问题:

TThread.resume is deprecated in Delphi-2010 what should be used in place?

0

你不应该在tthread上调用suspend,这样做不安全,resume只能用于启动一个被创建的线程。

在德尔福2010年的暂停和恢复,贬低和方法启动被引入来加强这一点。

如需更完整的解释,请在Codegears论坛中查看此thread

5

在构造函数中将CreateSuspended参数设置为true时创建的线程上调用Resume没有任何问题。 (为什么其他情况下会有一个CreateSuspended参数?)

但是,当您暂停/恢复运行线程的时会遇到麻烦。主要是由于引用了开放资源,如COM对象。 (例如,如果您有一个ADO连接对象处于活动状态,并且正在运行一个查询......暂停该线程并尝试稍后恢复它并不是非常理想......但显然这并不总是能够为您或在这种情况下的数据库连接)。

如果你对外部引用非常小心,那么暂停/恢复正在运行的线程会变得更加安全,除了可能会出现的竞争条件外......但这些是许多其他问题...

+0

或者一般情况下,您发送某种请求并等待某种响应的任何实例。 – 2015-08-03 20:32:58