我使用以下函数在我的表单上显示控件:
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毫秒所以我想把它放在一个线程中。我在Delphi中阅读了一些关于主题的教程,但我不明白如何用参数创建一个线程?在我的例子中,ctrl:TWinControl数组。
我想创建一个执行上述函数的线程,但我不明白如何使用参数调用它。在Delphi中使用线程更难。
任何帮助将不胜感激!
答案 0 :(得分:14)
由于Delphi VCL不是线程安全的,因此您不能将线程用于您的目的。更糟糕的是:它不仅不是线程安全的,而且只允许从应用程序的主线程调用VCL代码。
也就是说,在Delphi中创建一个线程就像声明TThread的后代类一样简单,重写它的Execute方法并实例化它。这很容易,接下来的一切都是困难的部分。
很抱歉没有帮助,但在不了解您正在使用的特定控件的情况下,我不知道如何解决问题。
答案 1 :(得分:11)
我认为问题在于AnimShowControl,因为它似乎会阻止整个GUI 250毫秒。它应该在设置定时器之后立即返回以逐渐进行动画效果(即,不使用睡眠呼叫的for / while)。
线程不是一种选择,在这种情况下,它确实会增加对伤害的侮辱。
答案 2 :(得分:5)
Delphi中的默认线程实现是TThread类。您继承了自己的类并覆盖了“execute”方法,该方法将在separete线程中运行。换句话说,您可以在构造函数中传递参数,也可以作为继承类的特性传递参数,只需确保在线程启动(“恢复”)之前传递参数。
我不太确定产生线程是你正在尝试做什么的正确方法,但它肯定会教你一两件关于Delphi线程的东西。如果您有任何具体问题,请知道在哪里提问。
P.S。 “Delphi中的线程化更难”。比什么更难?奥卡姆的线程? : - )
答案 3 :(得分:1)
这可能无法直接回答您的问题,但可能会解决您的问题......
我需要在应用程序上运行一些线程函数,并且(坦率地说)没有时间去学习Delphi线程或线程周期。原来我有一个组件,它包含在我已经购买的一组组件中,这使得我需要完成线程方面非常“可访问”且简单 - TacThread组件。我已经多次使用它来完成“加载”动画,同时运行复杂的查询,连接到Web服务器和服务等。如果您正在寻找快速简便的东西,可能值得一看。
答案 4 :(得分:0)
如果我正确理解你要做的事情......在界面中设置动画控件而不会锁定界面,因为每个控件等待动画完成250毫秒......你可以使用线程来实现。
基本上,创建一个计时器线程(基于TThread),并将该类的属性指定为一个回调方法,该方法引用表单或窗口小部件中处理绘图的方法。然后在线程的execute方法中执行定时器/循环,并在每次增加要更新可视显示的位置时,从线程的synchronize()方法中调用回调,以便在应用程序主线程中执行。
基本上,要启动动画,那么,您需要: - 创建线程(暂停) - 分配回调和所需的任何其他数据 - 执行线程 - 在每个间隔通过synchronize()方法更新显示 - 在250ms之后,让线程完成执行并自行释放。
这将做的是为每个小部件提供一个自己的计时器来处理动画,而不会干扰界面,同时它在动画期间的绘图更新之间“等待”。
此外,您可以考虑某种线程列表,以便您可以保持对创建的每个线程的引用,以在退出程序之前检查它们是否已完成(或者您最终可能会遇到难以调试的错误)
您还可以将活动发回主表单,而不是回调。
希望这有帮助