我写了一个控件,有一个Edit1和一个button1
有一个多线程类ff当我按button1的时候运行代码如下
ff.Create(edit1);
----------------------------------------
ff部分代码如下
--------------增加下面的包--------------
uses  StdCtrls,SysUtils;
---------------------------
privite中有个成员变量
i:integer;
----------------------------------
constructor ff.Create(edi:TEdit);
begin
  edit1:=edi;
  inherited create(false);
end;
---------------------------------
procedure ff.updateaa;
begin
   edit1.Text:=intToStr(i);
end;
------------------------------
procedure ff.Execute;
var j:integer;
begin
 for  j:=0  to 1000 do
  begin
    i:=j;
    Synchronize(updateaa);//运行第一次就死在这里,没有任何错误信息
  end;
end;
--------------------------------------------------
问题一:为什么不能运行Synchronize里面的函数
问题二:如果我改为excuet里面改为SocketConnection1.Connected:=true;
然后在AfterConnected的事件中,写向数据库读数据,都是在该线程中运行
为什么?我的Afterconnected是写在文件ActiveXForm中的阿,不是应该在主线程中运行吗?

解决方案 »

  1.   

    这样你试试:
    ------------------------------
    procedure ff.Execute;
    var j:integer;
    begin
     for  j:=0  to 1000 do
      begin
        i:=j;
        Synchronize(updateaa);//运行第一次就死在这里,没有任何错误信息
        if terminated
           then
             exit;
      end;
    end;
    --------------------------------------------------
      

  2.   

    楼上的大哥,不行啊,不过运行到,还是Synchronize(updateaa)死了不过我发现如果不使用Synchronize直接updateaa就可以,真是不明白??
    但是我把程序关闭,但是delphi还是显示running,必须使用ctrl+F2才能结束
      

  3.   

    经过一番努力,终于完成了
    原来窗体的线程和ocx事不同的1)窗体的多线程是在窗体的进程下分出来的所以要用到Synchronize同步
    2)而控件本身在窗体的进程下分出来的,而控件里面的线程就也是在窗体的进程下面
      

  4.   

    没有写完,按错了所以就不需要用Synchronize 同不,直接就可以在
    procedure ff.Execute;
    var j:integer;
    begin
     for  j:=0  to 1000 do
      begin
        i:=j;
       // Synchronize(updateaa);
       //改为
       updateaa // 就可以使用了
        if terminated
           then
             exit;
      end;
    end;
      

  5.   

    因为该线程是不会终止的,除非,窗体(进程)关闭(具体原因可能是因为控件里面的
    线程和控件线程是主线程得子线程,所以没有权限关闭,我猜,希望有高人指点)
    所以在
    button1onclick(Sender:Tobject
    begin;
     with  ff.Create(edit1) do 
      ff.onTramint(忘了怎样写):=afterAction;
    //永远都不会执行,因为线程只有在窗体(进程)关闭才结束
    end;procedure afterAction
    begin
    showmessage('线程完成');
    end;