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

Iva*_*nov 2 delphi multithreading

我使用以下函数来显示表单上的控件:

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;
Run Code Online (Sandbox Code Playgroud)

但是,它在每个控件上减速250毫秒,所以我想将它放在一个线程中.我在Delphi中阅读了一些关于主题的教程,但我不明白如何使用参数创建一个线程?在我的例子中ctrl:TWinControl数组.

我想创建一个执行上述函数的线程,但我不明白如何使用参数调用它.在Delphi中使用线程更难.

任何帮助将不胜感激!

dum*_*uch 14

由于Delphi VCL不是线程安全的,因此您不能将线程用于您的目的.更糟糕的是:它不仅不是线程安全的,而且只允许从应用程序的主线程调用VCL代码.

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

很抱歉没有帮助,但在不了解您正在使用的特定控件的情况下,我不知道如何解决问题.


utk*_*tas 11

我认为问题在于AnimShowControl,因为它似乎阻止了整个GUI 250毫秒.它应该在设置定时器之后立即返回以逐渐进行动画效果(即,不使用睡眠呼叫的for/while).

线程不是一种选择,在这种情况下,它确实会增加对伤害的侮辱.


Pau*_*Jan 5

Delphi中的默认线程实现是TThread类.您继承了自己的类并覆盖了"execute"方法,该方法将在separete线程中运行.换句话说,您可以在构造函数中传递参数,也可以作为继承类的特性传递参数,只需确保在线程启动("恢复")之前传递参数.

我不太确定产生线程是你正在尝试做什么的正确方法,但它肯定会教你一两件关于Delphi线程的东西.如果您有任何具体问题,您知道在哪里问.

ps"Delphi中的线程更难".比什么更难?奥卡姆的线程?:-)