我把我测试的代码全部复制出来,各位有经验的给看看,到底应该如何弄。我的问题是,当我的程序一运行结束,也就是说我的线程全部结束时候,程序就会报错。主单元代码:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls,unit2;type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure threadexit(sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  somethread: array of some;
  i2:integer;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
   setlength(somethread,10);
   i2:=0;
   for i:=0 to 10 do
     begin
       somethread[i]:=some.create(i,listview1);
       somethread[i].OnTerminate:=threadexit;
     end;end;procedure Tform1.threadexit(sender: TObject);
begin
  inc(i2);
  if i2 = 11 then
  showmessage('successful');
end;end.线程单元的代码:unit Unit2;interfaceuses
  Classes,ComCtrls,SysUtils,windows;//var
//lj:TRTLcriticalsection;type
  some = class(TThread)
  private
    tmp_lsv:Tlistview;
    tmp_i:integer;
  protected
    procedure Execute; override;
  public
    constructor create(i:integer;lsv:Tlistview);
  end;
implementation
uses unit1;constructor some.create(i:integer;lsv:Tlistview);
begin
  freeonterminate:=true;
  tmp_lsv:=lsv;
  tmp_i:=i;
  //InitializeCriticalSection(lj);
  inherited create(false);
end;
procedure some.Execute;
begin
  //Entercriticalsection(lj);
  if terminated then exit;
  with tmp_lsv.Items.add do
    begin
      caption := '这是第'+inttostr(tmp_i)+'条';
      subitems.Add('成功咯');
    end;
  //leavecriticalsection(lj);
end;end.
跟我用不用临界区一点关系都没有,照样报错。错误说程序运行时间错误,runtimeerror…………,一堆~!

解决方案 »

  1.   

    …………晕了这道题依然由我自己来解答了……我试着把with tmp_lsv.Items.add do
        begin
          caption := '这是第'+inttostr(tmp_i)+'条';
          subitems.Add('成功咯');
        end;写成一个过程,然后在execute中用synchronize同步一下,竟然不报错了…………
    实在想不通为什么…………我记得前日我也是用了同步的,不过依然报错。现在却又可以…………有点奇怪
      

  2.   

    VCL不是线程安全的,不能在线程中不以同步的方式操作界面元素。即使以同步方式操作界面元素,会碰上锁问题而使一些需要实时展现的效果出不来。推荐的方式是,在线程中处理数据,通过消息的方式通知窗口/主线程更新界面。