關於多線程進度條的問題 ( 积分: 50 )

H

hhmyz

Unregistered / Unconfirmed
GUEST, unregistred user!
簡寫如下:
mythread:=tmythread.create(false);--含有進度條的線程,由線程內變量i來控制
mystoredproc.execproc;--ado的存儲過程
但總是要到存儲過程執行完才執行進度條。
也試過把存儲過程換成sleep(1000)之類,也是要等到sleep執行完後進度條才開始執行.
求解.
 
簡寫如下:
mythread:=tmythread.create(false);--含有進度條的線程,由線程內變量i來控制
mystoredproc.execproc;--ado的存儲過程
但總是要到存儲過程執行完才執行進度條。
也試過把存儲過程換成sleep(1000)之類,也是要等到sleep執行完後進度條才開始執行.
求解.
 
在線期待中
 
不知道你说的啥.
很可能是线程内进度条没有接收到重画消息,每改变i值后,加一句Application.ProcessMessage.
 
没仔细研究过,我一般是将耗费时间的代码放到线程中,即将你的mystoredproc.execproc放到另一个线程中执行。
 
To:dmzn
還是不行。也是等到下面的存儲過程執行完後,進度條才開始走,直到走完。
To:dreamisx,
不想象你那樣,也算是尋求正常途徑下的一種解決方法。
線程裡就隻是一個execute過程裡簡單的變量i增加,進度條增加。其它什麼都沒加,也沒改.
procedure Tdataanaythread.Execute;
var
i:longword;
begin
f_kqdatamanager.ProgressBar1.Max:=100;
for i:=0 to 100do
begin
f_kqdatamanager.ProgressBar1.Position:=i;
application.ProcessMessages ;
sleep(500);--去掉這個加大i,然後設成i為10的倍數執行上面那一條還是不行.
end;
 
把存储过程放到线程里执行,进度条使用主线程。
 
按照線程的方法沒錯,為什麼不行。大家說說主線程裡放這樣的進度條不行嗎。
 
1、主程序控制进度条,用估计值,典型的像windows的文件复制。他告诉你的时间,进度都不像真的。
2、在存储过程中调用外部DLL,给主程序发送消息。
 
能说的在详细些吗?
 
楼主这样做是肯定不行的。
按照你自己的描述:
1、你在主线程里执行了一个耗时的方法调用;
2、你在一个线程里进行进度条的更新。
这样的设计是肯定达不到你预想的目的的。
loco兄的方法是正确的。应该在主线程更新进度条,在新创建的线程里调用你的存储过程。
至于为什么楼主的方法失效,是因为当主线程在执行耗时操作的时候,主线程被完全阻塞;而你在另外一个线程里更新进度条的操作涉及到界面的更新,这个更新操作是由主线程来响应更新请求来完成的,而这个时候主线程正好被阻塞了,所以从线程也会被阻塞,因为从线程的更新请求没有被响应。
这就是楼主所提问题的症结所在。为什么LOCO的方法可行,应该是很容易理解的了。
 
謝謝,明白問題所在
 
顶部