我把我测试的代码全部复制出来,各位有经验的给看看,到底应该如何弄。我的问题是,当我的程序一运行结束,也就是说我的线程全部结束时候,程序就会报错。主单元代码: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…………,一堆~!
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…………,一堆~!
解决方案 »
- delphi中sql语句总有问题
- 高手快来啊,这么难的问题么?Access数据库,下面的sql语句为什么报错了?
- 关于线程的问题
- 吐血再贴!!!!!
- 两个不同的程序对同一个数据库进行新后的刷新问题?(此问题长久以来都没有好答案)
- 郁闷,有问题
- 100分求翻译一段代码,c++ to delphi(pascal),应该很简单
- 请教关于delphi换行的问题
- 如何知道插入的是什么盘符
- 如何在数据网格中显示:ĈĉĜĝĤĥĴĵŜŝŬŭ(这里都是ASCII值)
- 100分求将网页设置为壁纸的代码
- 关于单元的问题,请大家关注一下。
begin
caption := '这是第'+inttostr(tmp_i)+'条';
subitems.Add('成功咯');
end;写成一个过程,然后在execute中用synchronize同步一下,竟然不报错了…………
实在想不通为什么…………我记得前日我也是用了同步的,不过依然报错。现在却又可以…………有点奇怪