多窗体大循环的问题(200分)

D

dqxhyy

Unregistered / Unconfirmed
GUEST, unregistred user!
我的mdi窗体里有两个子窗体,form1和form2
在form1里有一个按钮,里面有一个for i:=0 to 100000的大循环
具体如下
for i:=0 to 100000do
begin
caption:=inttostr(i);
application.ProcessMessages;
end;
同样,在form2里也有一样的大循环
当我先按form1的按钮的时候,form1的循环开始执行,标题栏开始变数,这个时候,我再按form2里的按钮的时候,form2的大循环也开始运行了,form2里的标题也开始变数,但是这个时候form1里的大循环居然暂停了,只有当 form2里的大循环执行完毕后,form1里的大循环才开始继续运行,请问,我现在想实现这两个窗口同时自己执行自己的大循环,二者不互相干扰,我该如何处理?
QQ:87873303
 
多线程就可以,D7的例子
C:/Program Files/Borland/Delphi7/Demos/Threads
 
你的i是全局的吧,这样应该是干扰了,要不把i定义成局部变量
 
i是局部变量
 
我不想对窗体里的代码做改动,我想把整个窗体处理成单独线程的,不知道如何实现
 
我就想不明白,你说mdi模式,不就是为了多窗口操作的么?为什么还有互相干扰的现象呢,你说mdi模式还有什么意义么?
 
多线程:
//==================== Form1 中 =============
type
TTestThread = class(TThread)
protected
Procedure Execute;
override;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
th: TTestThread;
begin
th:= TTestThread.Create(false);
end;
{ TTestThread }
procedure TTestThread.Execute;
var
i: integer;
begin
FreeOnTerminate:=true;
for i:=0 to 10000do
Form1.Caption:=inttostr(i);
end;

//==================== Form2 中 =============
type
TTestThread = class(TThread)
protected
Procedure Execute;
override;
end;
...
procedure TForm2.Button1Click(Sender: TObject);
var
th: TTestThread;
begin
th:= TTestThread.Create(false);
end;
{ TTestThread }
procedure TTestThread.Execute;
var
i: integer;
begin
FreeOnTerminate:=true;
for i:=0 to 10000do
Form2.Caption:=inttostr(i);
end;
 
to 楼主:
“多窗口操作”并不代表这些窗口就可以同时被操作。
CPU 不是多任务的,双核也不能实现真正意义上“多任务”。
操作系统是多任务操作系统没错,这些任务的其实就是“线程”,一个线程只能分配一个 CPU 时间片。
建议使用多线程,因为是大循环,讲究效率。
其次就是放弃使用 for 循环,改用时钟 TTimer ,或者 SetTimer。
 
form1的application.ProcessMessages暂停程序并释放CPU给系统使用,开始系统没有
什么干的,所以马上返回form1的循环体,继续工作。
但当系统在接到点击form2的按钮之后,立即通知form2开始循环,form1的application.ProcessMessages被挂起来,form2的application.ProcessMessages也是
暂停程序并将CPU交给系统使用,由于系统没有什么需要干的,注意它不会因此而返
回form1的循环内,而是返回form2的循环体,直到form2的循环结束,才返回form1的
循环。
使用多线程,TTimer和SetTimer本身也是线程,也可以。
 
很简单,把Form2.ShowModal改成Show就可以了。
实在不行才用线程。
 
man8888,新来的吧?
 
顶部