1.线程里面调用VCL不安全,到底怎么操作不安全,我做一个字幕滚动,就改下LABEL的位置安全否?不见控件操作起来安全否,比如TCientSockte?2.把字幕滚动的过程labelroll()放到Synchronize,结果界面冻结了,直接放到线程中则没事(但是不安全?)
procedure labelroll()
begin
          while( Label1.Top>-16)do
          begin
            Label1.Top:=Label1.Top-2;
            Label2.Top:=Label2.Top-2;
            Sleep(1000);
          end;
          
end;
我想正确的写法可能是线程中放:
          while( Label1.Top>-16)do
          begin
            Synchronize(移动LABEL);               
            Sleep(1000);
          end;
3.我有一个函数,里面有很多操作,需要放到一个线程里面执行.
我发现Synchronize(直接套这个函数),结果执行时界面冻结,就是说用Synchronize时,多程序根本不起作用.
但是函数里面有很多VCL控件,大部分是涉及网络操作的不可见控件,这些控件不套用Synchronize安全吗?
谢谢大家!

解决方案 »

  1.   

    比如检测网络连接,这个是需要时间的,但是IdIcmpClient又是一个VCL控件,这个能放到线程里吗,如果必需要套上一个Synchronize,那么,线程根本就没有用了,还是卡
    function TForm1.ISinternetokPing:Boolean;
    var
    IdIcmpClient: TIdIcmpClient;
    begin
    result:=False;
    IdIcmpClient := TIdIcmpClient.Create(Self);
    IdIcmpClient.ReceiveTimeout :=2000;
    IdIcmpClient.Host :='baidu.com';
    try
       IdIcmpClient.Ping;
       if IdIcmpClient.ReplyStatus.ReplyStatusType = rsecho then
       result:=True;
    except
    end;
    end;
    end;盼高手解答
      

  2.   

    Synchronize,我用线程从来没用过这个东西!如果要操作主界面中的某个可见或不可见的对象时,在创建线程时以参数的形式传递进去,或者定义全局变量来实现就可以了。没什么问题,我经常这样用!
      

  3.   

    1. (1)不安全 (2)安全
    2. 想法正确
    3. 改成这样就是安全的:
    function TForm1.ISinternetokPing:Boolean;
    var
    IdIcmpClient: TIdIcmpClient;
    begin
    result:=False;
    IdIcmpClient := TIdIcmpClient.Create(nil);
    try
    IdIcmpClient.ReceiveTimeout :=2000;
    IdIcmpClient.Host :='baidu.com';
    try
      IdIcmpClient.Ping;
      if IdIcmpClient.ReplyStatus.ReplyStatusType = rsecho then
      result:=True;
    except
    end;
    finally
    IdIcmpClient.free
    end;
    end;
    end;
      

  4.   


    非常感谢!是否如果能十分确定,一个VCL资源只有一个线程访问,就可以不用Synchronize.
    比如我在自建的一个线程中移动label的位置,主线程及其它线程只要不操作这个label就可以直接放在线程里运行?
      

  5.   

    可视VCL组件,只能在主线程中操作,都是线程不安全的。
      

  6.   

    在界面上显示的还是要同步到主线程,需要Synchronize或消息等同步手段
      

  7.   

    VCL线程不安全是说界面相关的部分控件(有几个控件有线程安全方面的东西)。IdIcmpClient是其他公司开发的,不算在VCL里面。
    放到Synchronize的函数必须短小。另外你那个Sleep(1000)都放到Synchronize里肯定死机。