2009-07-11 101 views
2

我用下面的函数来显示我的窗体上的控件:如何在Delphi中创建一个线程?

class procedure TFormMain.FadeControls(ctrl:Array of TwinControl); 
var element:TwinControl; 
begin 
    for element in ctrl do 
    begin 
    PrepareForAnimation(element); 
    element.Visible := true; 
    AnimShowControl(element,250); 
    end; 
end; 

但是,它会减慢对各控制250毫秒,所以我希望把它放在一个thread.I读了一些教程有关在德尔福领导,但我不明白如何创建一个带参数的线程?在我的情况下,CTRL:TWinControl数组。

我想做一个线程来完成上面的功能,但我不明白如何用参数调用它。Delphi中的线程更难。

任何帮助将不胜感激!

回答

14

由于Delphi VCL不是线程安全的,因此无法为您的目的使用线程。更糟糕的是:它不仅不是线程安全的,只允许从应用程序的主线程调用VCL代码。

这就是说,在Delphi中创建一个线程就像声明TThread的后代类一样简单,重写它的Execute方法并实例化它。这是很容易的部分,接下来的一切都是很难的部分。

对不起没有帮助,但不知道更多关于您使用的特定控件,我不知道如何解决这个问题。

5

Delphi中的默认线程实现是TThread类。你继承了你自己的类并且重写了“execute”方法,它将在一个单独的线程中运行。换句话说,您可以在构造函数中传递参数,也可以将其作为继承类的特性,只要确保在线程启动(“恢复”)之前传递参数即可。

我不太确定产卵线程是你想在那里做什么的正确方法,但它肯定会教你一些关于Delphi线程的东西。如果你有任何具体的问题,你知道在哪里问。

p.s. “Delphi中的线程更难”。比什么更难?线程在Occam中? :-)

11

我认为问题在于AnimShowControl,因为它似乎阻止整个GUI 250 ms。设置定时器后,应立即返回,以便逐渐进行动画效果(即不要使用带睡眠呼叫的“/”)。

线程不是这里的选项,在这种情况下确实会增加伤害。

1

这可能不是直接回答你的问题,但可能解决您的问题在手...

我有一个需要在应用程序运行某些线程功能而回,和(坦率地说)没”没有时间去深入了解Delphi线程或线程的时间。事实证明,我有一个组件已包含在我已经购买的一组组件中,这使得我需要以线程方式实现非常“易于访问”且简单的组件 - TacThread组件。我已经多次使用它来完成“加载”动画,同时运行复杂的查询,连接到Web服务器和服务等。如果您寻找快速简单的内容,可能值得一看。

0

如果我正确理解你要做的事情......在界面中设置动画控件而不锁定界面,因为每个控件都会等待250ms以完成其动画......你可以使用线程来实现这一点。

基本上,创建一个定时器线程(基于TThread类),并指定为该类引用您的形式或小工具,处理绘图中的一个方法的回调方法的属性。然后在线程的execute方法中执行定时器/循环,并且在每次增加想要更新视觉显示的位置时,从线程的synchronize()方法中调用回调,以便在应用程序主线程中执行该回调。

基本上,以启动动画,然后,你最好: - 创建线程(悬浮) - 分配回调,需要 任何其它数据 - 执行线程 - 在每个时间间隔经由所述更新显示同步()方法 - 250ms后,让线程完成执行并释放它自己。

这是什么会做的是提供每个插件它自己的计时器来处理动画而不同时接口干扰的“等待”动画期间将更新之间英寸

此外,你可以考虑某种形式的主题列表中,这样就可以保持参照创建的每个线程,检查退出程序之前,他们完成(或者你可以用难以最终调试错误)

除了回调之外,您还可以将活动发回主窗体。

希望这会有所帮助