如何保持主界面可操作?(50分)

  • 主题发起人 主题发起人 maorui
  • 开始时间 开始时间
M

maorui

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主界面设置了一个Start按钮,运行一些时间很长的Thread。
这时主界面的Stop/Suspend按钮都不可用。如何能够保持主界面可操作?
 
在Thread里不时的调用application.processmessage试试。
 
(减低)指定Thread的优先级
 
show 另外一个form,并在其上操作,如何?
 
Thread.Priority :=
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
tpTimeCritical);
 
上面的方法都不行。
我看了一下,似乎是TThread.Waitfor造成的。
 
改了一下程序,Application.ProcessMessage可以工作了。
但是又碰到新的麻烦。
主界面里面有个Memo控件,只要点住Scrollbar拖动,Thread就会停下来。这又该如何处理呢?
 
你的线程和MEMO有关系吗
是什么程序
 
start按钮和memo控件都在主界面上。
start会启动一些thread,并等待thread运行结束,最后在memo中显示thread运行结果。
 
这样做的话,其实用多线程一点意义都没有了
 
怎么会没意义?可以并发处理事务。
现在麻烦的是主界面不敢操作。
 
多线程同时访问VCL没办法,可以在OnTerminate里面访问memo!
 
不是thread访问VCL,VCL访问都在Start里面。
另外,Thread怎么不能访问,只要保证Threadsafe就行。D7的Thread Demo就是这样的。
 
把你的代码贴出来看看吧
 
太长了~~~~~大致上是这样的:
procedure TForm_Main.Btn_StartClick(Sender: TObject);
begin
workthread.create;
workthread.waitfor;
//程序在这里停下来了
//结果处理,往Memo写数据
workthread.free;
end;

procedure TForm_Main.Btn_StopClick(Sender: TObject);
begin
thread.Terminate;
end;

procedure TWorkThread.Execute;
bagin
while not Terminateddo
begin
//工作处理
Application.ProcessMessage;
end;
end;

PorcessMessage现在有时有用,更多时候不管用。Form_Main界面死掉了。
没有死掉时候,只要拖动Memo控件的滚动条,workthread就停止运行。Memo控件仅仅记录结果,没有其他代码。
 
后退
顶部