【发布时间】:2011-07-16 20:14:59
【问题描述】:
我创建了一个派生自 TThread 的类,因为我希望做一些异步的东西,但是为了避免创建另一个类,我围绕该线程类构建了整个东西。不确定这是否是好的做法,如果我不能让它工作,那么我想我别无选择,只能重新编码..
问题:我在 FormCreate 上创建线程,分配一些属性,然后在 FormDestroy 上释放它。在 Thread 的构造函数中,我设置了FreeOnTerminate = False。当我单击表单上的按钮时,我Start(); 线程。好的,所以它按预期运行,发生错误(预期!),它被传递给我的错误处理事件,它似乎终止。然后我再次单击该按钮,我得到一个Cannot call Start on a running or suspended thread 错误。
如何在不释放线程的情况下完成线程并重新启动它?
【问题讨论】:
-
如果你想让一个线程在整个应用程序生命周期中都存在,为什么让它终止(或出现),然后尝试重新启动它?你可以使用一段时间(真)开始..结束;环形。如果你想通过点击按钮来控制线程体的运行,请查看 TEvent、TSimpleEvent 或 TSemaphore。
-
@Martin - 我再次启动它以运行 Execute 例程。 :)
-
把while循环放到TThread.execute中!在循环的顶部,等待 TEvent、TSimpleEvent 或 Tsemaphore 等待对象。当您希望线程执行循环内的任何操作时,请从您的 Button.onClick() 事件中向等待对象发出信号。您只需要 start() 线程一次 - 在构造函数的末尾。
-
.. 还是不行。显然, TThread.start 是在 TThread 构造函数之外调用的,所以我的建议很糟糕 :(( 所以要么调用构造函数,然后 Start() 要么使用创建线程的“旧系统”挂起,(继承的 create( true)),在构造函数的开头并在结尾调用 resume()。TBH,有时 Borland/Embarcadero 似乎试图使线程尽可能尴尬。resume() 没有问题,只要它只在 TThread 构造函数的末尾使用过。
标签: multithreading delphi