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