代码我看了一下,这样改动,没有出现问题!原来的线程排序过程 procedure TSortThread.Sort(var A:array of Integer); 中的语句 Form2:= TForm2.Create(nil); Form2.ShowModal; 去掉,转而放在事件处理过程 procedure TForm1.Button1Click(sender:Tobject); 中去,代码大体如下: ... if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal;
TO: yuvotesyg518(小不点) ( ) ,这样不是我的需求: 转而放在事件处理过程 procedure TForm1.Button1Click(sender:Tobject); 中去,代码大体如下: ... if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal; 注意:我是要在线程中:比如那个排序语句中弹出窗体,而不是:procedure TForm1.Button1Click(sender:Tobject);中啊!!!!
不过两者的结果都是“排序完成然后弹出Form2”呀! procedure TForm1.Button1Click(sender:Tobject); begin setLength(asort,4); asort[0]:=13; asort[1]:=9; asort[2]:=15; asort[3]:=12; SortThread:=TSortThread.Create(False,aSort); SortThread.OnTerminate:=SortOver; if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal; end;
改动一下,应该把代码: if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal; 放到 procedure TForm1.SortOver(sender:Tobject); 中去,代码变成: procedure TForm1.SortOver(sender:Tobject); var i:integer; begin Memo1.Lines.Clear; for i:=0 to 3 do begin Memo1.Lines.Add(inttostr(asort[i])); end;if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal;因为前面的代码中有: SortThread.OnTerminate:=SortOver; 所以线程一终止,Form2立即显现出来。
这样也不是我的需求啊,我是要在“线程中”,而不是线程执行“之前”或“终止时”, 简单点:我就是要在: for i:=High(A) downto Low(A) do for j:=Low(A) to High(A)-1 do if A[j]>A[j+1] then begin t:=A[j]; A[j]:=A[j+1]; A[j+1]:=T; //........... if Terminated then Exit; end; 的注释处弹出。
终于我给解决了,哈哈!!给你的线程新增加一个无参数的过程: type TSortThread = class(TThread) private { Private declarations } FSortArray:array of integer; protected procedure Execute; override; procedure Sort(var A:array of Integer); //这是个新加方法,用于显示Form2 procedure Show; public constructor Create(CreateSuspendend:Boolean;var SortArray:array of integer); end;procedure TSortThread.Show; begin if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal; end;然后,原来线程排序过程 procedure TSortThread.Sort(var A:array of Integer); 中,出现 if not Assigned(Form2) then Form2:= TForm2.Create(Application); Form2.ShowModal; 的地方改为: Synchronize(Show);
Form2.ShowModal;你ShowModal會使得本線程掛起得。。 你用Show試一下。。注意 指定 Form2得Parent...線程安全 就是線程之間得同步,特別是在訪問相同,相關得資源時,需要自行處理好同步關系
不:Form2.ShowModal;
就出错啊!!!
把上面这一句换成:
Form2:= TForm2.Create(Application)
试试看!
声明一下,我可不是什么高手,新手而已!
Form2.ShowModal;用这个!!!
yuvotesyg518(小不点),我已经给你发过去了!!!
帮个忙,代码不复杂!!!
procedure TSortThread.Sort(var A:array of Integer);
中的语句
Form2:= TForm2.Create(nil);
Form2.ShowModal;
去掉,转而放在事件处理过程
procedure TForm1.Button1Click(sender:Tobject);
中去,代码大体如下:
...
if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;
转而放在事件处理过程
procedure TForm1.Button1Click(sender:Tobject);
中去,代码大体如下:
...
if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;
注意:我是要在线程中:比如那个排序语句中弹出窗体,而不是:procedure TForm1.Button1Click(sender:Tobject);中啊!!!!
Form2:=TForm2.CreateNew(nil);
虽然可以,但是如果Form2上放控件的话,控件不能显示出来啊!!!
procedure TForm1.Button1Click(sender:Tobject);
begin
setLength(asort,4);
asort[0]:=13;
asort[1]:=9;
asort[2]:=15;
asort[3]:=12; SortThread:=TSortThread.Create(False,aSort);
SortThread.OnTerminate:=SortOver; if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;
end;
if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;
放到
procedure TForm1.SortOver(sender:Tobject);
中去,代码变成:
procedure TForm1.SortOver(sender:Tobject);
var
i:integer;
begin
Memo1.Lines.Clear;
for i:=0 to 3 do
begin
Memo1.Lines.Add(inttostr(asort[i]));
end;if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;因为前面的代码中有:
SortThread.OnTerminate:=SortOver;
所以线程一终止,Form2立即显现出来。
简单点:我就是要在:
for i:=High(A) downto Low(A) do
for j:=Low(A) to High(A)-1 do
if A[j]>A[j+1] then
begin
t:=A[j];
A[j]:=A[j+1];
A[j+1]:=T; //...........
if Terminated then Exit;
end;
的注释处弹出。
然后要是是在project里面
则Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.run;
要是在另外一个form或者unit里面
可以这样写
try
Form2:=TForm2.Create(self);
Form2.ShowModal;
finally
FreeAndNil(Form2);
end;
不知道这样行不行:)
虽然可以,但是如果Form2上放控件的话,控件不能显示出来啊!!!
这样也不行啊
type
TSortThread = class(TThread)
private
{ Private declarations }
FSortArray:array of integer;
protected
procedure Execute; override;
procedure Sort(var A:array of Integer);
//这是个新加方法,用于显示Form2
procedure Show;
public
constructor Create(CreateSuspendend:Boolean;var SortArray:array of integer);
end;procedure TSortThread.Show;
begin
if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;
end;然后,原来线程排序过程
procedure TSortThread.Sort(var A:array of Integer);
中,出现
if not Assigned(Form2) then
Form2:= TForm2.Create(Application);
Form2.ShowModal;
的地方改为:
Synchronize(Show);
不知可否指点:Synchronize() 函数的作用???
你的QQ呢?