2016-07-21 111 views
5

我有一个的TThread对象,并希望能够启动/通过一个按钮来停止线程程序的主要形式。我一直在寻找方法来做到这一点,到目前为止,我有以下想法:“暂停”,线程与属性

  1. 终止和释放线程,当用户单击停止,并单击开始时创建一个新的。
  2. 使用睡眠延迟线程(我不想这样做)
  3. 有一个属性是一个布尔值来确定线程是否暂停或不。 Execute中的代码只有在此布尔值为false时才会发生。

我倾向于#3。在主窗体的TThread对象上设置布尔属性是否是线程安全的?

哪个选项,或任何更好的选择,我应该去?这是我第一次使用线程,所以任何帮助表示赞赏。

+2

最近版本的Delphi不允许暂停/恢复线程,因为整个设计(和概念)都有缺陷。您应该避免尝试这样做,并切换为使用发信号事件(例如,TEvent)。查看SyncObjs中的各种事件类型。 –

+1

又见http://stackoverflow.com/questions/4401171/self-suspending-a-thread-in-delphi-when-its-not-needed-and-safely-resuming – kludg

回答

9

1.终止并释放线程,当用户单击停止并单击开始时创建一个新线程。

这当然是一种选择,如果开销最小。

3.有一个属性是一个布尔值,以确定线程是否已暂停。 Execute中的代码只有在此布尔值为false时才会发生。

你可以这样做,但你必须定期检查布尔值,如果设置,则输入一个等待循环,直到它被清除或线程被发送信号终止。

会在主窗体的TThread对象上设置一个布尔属性是线程安全吗?

与调用TThread.Terminate()一样,它只是设置布尔TThread.Terminated属性的线程安全。

我应该选择哪个选项或更好的选择?

我使用选项#4 - 使用信号事件而不是布尔值。例如:

​​
+0

Remy,什么是'CheckPause'方法中的'SysUtils.Abort;'。 –

+0

下一次'Terminate()'被调用后调用'CheckPause()',它会引发'EAbort'异常立即终止线程(因为'Execute()'不会捕获它)。 –

-1

退房启动和停止此线程德尔福维基:http://docwiki.embarcadero.com/RADStudio/Berlin/en/Starting_and_Stopping_Threads

这是适用的,早在德尔福7.可适用再往前追溯,但我无法证实早期版本。

+2

这是问题的评论,不是一个答案。答案在这里包含相关信息,其中链接仅用于提供其他参考。答案应该是独立的,这样如果由于某种原因(移动,脱机或其他)导致不在场外的位置不可用,它们就会包含价值。链接只有答案不这样做。 –

+2

欢迎使用堆栈溢出。你还没有回答这个问题。这个问题需要一个建议,但你忽略了提供一个建议。请[编辑]您的答案,以便解决问题所要求的内容。 –