代码如下
  按钮的代码:
  var
  i,ti:integer;
  begin
   label1.Caption:=inttostr(memo1.Lines.Count);
   if bool then    //只创建一次,免得让程序出错
    begin
    aa:=0;
    i:=memo1.Lines.Count;  //先要知道有多少个地址
    setlength(Taa,i);  //然后就分配一下内存空间,让线程能够占用内存来执行;
    for Ti:=0 to i do
    begin
     Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程
     Taa[ti].OnTerminate:= abcxd;
    end;
    end;
   bool:=false;
   end;
线程的代码
/////////////////////////////////////////////////////////
constructor Tss.Create(aa:string);
begin
  strurl :=aa;    // 接收传递过来的地址
  FreeOnTerminate := True; // 自动删除
  InitializeCriticalSection(CS);
  inherited Create(False); // 直接运行
end;procedure Tss.datamemo;
begin
  form1.Memo2.Lines.Add(strurl);
end;procedure Tss.Execute;
begin
  { Place thread code here }
  EnterCriticalSection(cs);
  if checkurl(strurl) then    //如果地址存在的话
  Synchronize(DataMemo)     //就同步执行的添加操作
  else
  form1.Memo2.Lines.Add('地址出现错误');
  LeaveCriticalSection(CS);
end;
//////////////////////////////////////////////到底是哪里出错了。。为什么会弹出那一个操作尼?

解决方案 »

  1.   

      线程最好不要直接访问主线程的对像,这个问题会多多,你这个问题应该是一个死循环对wincontrol操作的问题引起的,建议采用事件处理,以下是事件处理的一个Demo//线程
      type     TMyEvent = procedure(sender:TObject;msg:string) of object;    Tmythread = class(tthread)
        private
           FmyEvent : TMyEvent;
           procedure helloword(const msg:string);
        published
           property OnEvent:TMyEvent read FmyEvent write FmyEvent;   
        end;    procedure Tmythread.(const msg:string);
        begin
           if assigned(OnEvent)   then
           OnEvent(this,msg);
        end;//应用程
     
    type 
        TForm1 = class(tform)
        mmo1:tmemo;
        private
           procedure ReceiveEvent(sender:TObject;msg:string);
        end;    procedure TForm1.ReceiveEvent(sender:TObject;msg:string);
        begin
           mmo1.lines.add(msg) ;
        end;    //启动线程
        dd := Tmythread.create;
       dd.onEvent := ReceiveEvent;
          
      
      

  2.   

    procedure Tss.Execute; 
    begin 
      { Place thread code here } 
      EnterCriticalSection(cs); 
      if checkurl(strurl) then    //如果地址存在的话 
      Synchronize(DataMemo)    //就同步执行的添加操作 
      else 
      form1.Memo2.Lines.Add('地址出现错误'); 
      LeaveCriticalSection(CS); 
    end; 这一段改成:
    procedure Tss.ShowError;
    begin
      form1.Memo2.Lines.Add('地址出现错误');
    end;procedure Tss.Execute; 
    begin 
      { Place thread code here } 
      if checkurl(strurl) then    //如果地址存在的话 
        Synchronize(DataMemo)    //就同步执行的添加操作 
      else 
        Synchronize(ShowError);
    end;已经加了Synchronize,没必要再用互斥量。
      

  3.   

    system error code 4 : The system cannot open the file.
    你在操作文件吗?确保这个文件没有被其它线程占用.
      

  4.   

    你的大概目的在线程中操作另一个线程的VCL对象吧(往DEMO添加数据)!我建议你不要这样搞,要有一个公共数据区的概念(设置一个全局变量);你要添加数据时, 
      1.调用临界区对象的AQUIRE后,直接修改全局变量,然后在调用临界区对象RELEASE;
      2.发个消息给主线程的窗体,告诉它有新的数据,主线程从读取全局变量并清空;(注意要调用临界区对象哦)
      

  5.   

    我已经测试只是简单的用多个线程同步执行写入memo但还是溢出..问题不知道在哪里哦。
    或许有哪一位朋友能贴一个关于操作多个线程的实例看看.我现在把贴子加到一百分
      

  6.   

       i:=memo1.Lines.Count;  //先要知道有多少个地址 
        setlength(Taa,i);  //然后就分配一下内存空间,让线程能够占用内存来执行; 
        for Ti:=0 to i do //这儿应该是i-1,改成 for Ti:=0 to i-1 do    begin 
        Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程 上面是你的部分代码
      

  7.   

    DELPHI天生很多類對線程支持不好,哪果要操作的話,最好做一個羿步操作
      

  8.   

        for Ti:=0 to i do 
        begin 
        Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程 
        Taa[ti].OnTerminate:= abcxd; 
        end; 
    这个应该是 for Ti:=0 to i-1 do 吧?
      

  9.   

    form1.Memo2.Lines.Add('地址出现错误'); 
    这样直接操作控件总感觉不太好,最好用事件的方式通知.
      

  10.   


    procedure Tss.Execute; 
    begin 
      { Place thread code here } 
      EnterCriticalSection(cs); 
      if checkurl(strurl) then    //如果地址存在的话 
      Synchronize(DataMemo)    //就同步执行的添加操作 
      else 
      form1.Memo2.Lines.Add('地址出现错误'); 
      LeaveCriticalSection(CS); 
    end; 
    form1.Memo2.Lines.Add这一句不一定非要直接操作Memo2,
    而是声明一个事件,当出现错误的时候触发这个事件。而主窗体创建该线程的时候,写个方法绑定该线程的事件。
    在该窗体的方法中去实现具体的代码,这样做的好处是线程不依赖任何窗体,保证线程的独立性。
      

  11.   

    我这几天重新换了一种像朋友说的那样。向线程传递一下memo值来操作.但是发现。有的时候正常。有的时候却卡在那里一动也不动了
      

  12.   

    unit uTss;interfaceuses
      Classes,Windows;type
      Tss = class(TThread)
      private
        strurl:string;
        procedure datamemo;
        function checkurl(url:string):boolean;
        procedure AddressError;
      protected
        procedure Execute; override;
      public
        constructor Create(aa:string);
      end;implementation{ Tss }
    uses unit1;
    procedure Tss.AddressError;
    begin
      form1.Memo2.Lines.Add('地址出现错误');
    end;function Tss.checkurl(url: string): boolean;
    begin
      result:=true;
    end;constructor Tss.Create(aa:string);
    begin 
      strurl :=aa;    // 接收传递过来的地址
      FreeOnTerminate := True; // 自动删除
      inherited Create(False); // 直接运行 
    end; procedure Tss.datamemo;
    begin 
      form1.Memo2.Lines.Add(strurl);
    end; procedure Tss.Execute; 
    begin
      { Place thread code here }
      //EnterCriticalSection(cs);
      if checkurl(strurl) then    //如果地址存在的话
      Synchronize(DataMemo)    //就同步执行的添加操作
      else
      Synchronize(AddressError);
      //LeaveCriticalSection(CS);
    end; 
    end.
      

  13.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,uTss;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Label1: TLabel;
        Memo2: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure abcxd(Sender:TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      b:boolean=true;
      aa:integer;
      Taa:array of Tss;
      CS:TRTLCriticalSection;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      i,ti:integer;
    begin
      label1.Caption:=inttostr(memo1.Lines.Count);
      if b then    //只创建一次,免得让程序出错
        begin
        aa:=0;
        i:=memo1.Lines.Count;  //先要知道有多少个地址
        setlength(Taa,i);  //然后就分配一下内存空间,让线程能够占用内存来执行;
        for Ti:=0 to i-1 do
        begin
        Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程
        Taa[ti].OnTerminate:= abcxd;
        end;
        end;
      b:=false;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      //InitializeCriticalSection(CS);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      //deletecriticalsection(CS);
    end;procedure TForm1.abcxd(Sender: TObject);
    begin
    //
    end;end.