繁体   English   中英

如何在Delphi中创建一个线程?

[英]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中的线程更难”。 比什么更难? 奥卡姆的线程? :-)

这可能不会直接回答您的问题,但可能会解决您的问题......

我需要在应用程序上运行一些线程函数,并且(坦率地说)没有时间去学习Delphi线程或线程周期。 原来我有一个组件,它包含在我已经购买的一组组件中,这使得我需要完成线程方面非常“易于访问”和简单 - TacThread组件。 我已经多次使用它来完成“加载”动画,同时运行复杂的查询,连接到Web服务器和服务等。如果您寻找快速简便的东西,可能值得一看。

如果我正确理解你想要做什么...在界面中设置动画控件而不锁定界面,因为每个控件等待250ms以完成动画...你可以使用线程来实现。

基本上,创建一个计时器线程(基于TThread),并将该类的属性指定为一个回调方法,该方法引用表单或窗口小部件中处理绘图的方法。 然后在线程的execute方法中执行定时器/循环,并在每次增加要更新可视显示的位置时,从线程的synchronize()方法中调用回调,以便在应用程序主线程中执行。

基本上,要启动动画,那么,你需要: - 创建线程(暂停) - 分配回调和所需的任何其他数据 - 执行线程 - 在每个间隔通过synchronize()方法更新显示 - 在250ms之后,让线程完成执行并释放自己。

这将做的是为每个小部件提供一个自己的计时器,它处理动画而不会干扰界面,同时它在动画期间的绘图更新之间“等待”。

此外,您可以考虑某种线程列表,以便您可以保持对创建的每个线程的引用,以在退出程序之前检查它们是否已完成(或者您最终可能会遇到难以调试的错误)

您也可以将活动发回主表单,而不是回调。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM