多線程的問題(這段段碼錯在哪?)(50分)

  • 主题发起人 主题发起人 jensia
  • 开始时间 开始时间
J

jensia

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TPRThread = class(TThread)
private
lGuage:TGauge;
{ Private declarations }
proceduredo
Something;
protected
procedure Execute;
override;
public
constructor Create(AGuage:TGauge);
end;

implementation
{ TPRThread }
constructor TPRThread.Create(AGuage:TGauge);
begin
Inherited Create(false);
lGuage:=AGuage;
FreeOnTerminate:=true;
end;

procedure TPRThread.Execute;
begin
Synchronize(doSomething);
if Terminated then
exit;
{ Place thread code here }
end;

procedure TPRThread.doSomething;
var
i:integer;
begin
for i:=0 to 1000do
begin
lGuage.Progress:=i;
sleep(100);
end;
end;

end.

然后在Form里創建線程:
lPRThread:=TPRThread.Create(Gauge1);
//Create Tmp Table
問題是:
會陷入死循環.為何???請問哪位高手可以給出相同的原碼?還是哪里有比較好的例子可以下載.
 
type
TPRThread = class(TThread)
private
lGuage:TGauge;
{ Private declarations }
proceduredo
Something;
protected
procedure Execute;
override;
public
constructor Create(AGuage:TGauge);
end;

implementation
{ TPRThread }
constructor TPRThread.Create(AGuage:TGauge);
begin
Inherited Create(false);
lGuage:=AGuage;
FreeOnTerminate:=true;
end;

procedure TPRThread.Execute;
var
i:integer;
begin
for i:=0 to 1000do
begin
Synchronize(doSomething);
if Terminated then
exit;
sleep(100);
end;
{ Place thread code here }
end;

procedure TPRThread.doSomething;
begin
lGuage.Progress:=i;
end;

end.

 
for i:=0 to 1000do
sleep(100);
时间是多少[?][?][?]
 
其實我的目的不是要顯示那個gauge,而是想利用多線程來處理大量的數據計算.
一個線程顯示 gauge
另一個線程式 來處理數據計算
請給出相應的算法. 謝洛 :)
 
你应该把你的大量数据计算放在Execute中,把界面刷新的工作放在Synchronize中。
采用Synchronize方法执行的过程实质上在主线程中执行,所以会死锁。
 
謝謝远帆兄
不知哪位大俠有更優的答案!?
 
我是這么想:
一個procedure 處理大量計算
另一個procedure 處理進度條
然后用 Synchronize 方法,在Execute中調用!
各位大俠覺得如何,但我不會寫.試了几下,老出錯.
 
constructor TPRThread.Create(AGuage:TGauge);
begin
Inherited Create(TRUE);
lGuage:=AGuage;
FreeOnTerminate:=true;
Suspended:=False //启动线程。
end;
如果你只是进行数值计算,不用加Synchronize。(建议)
 
当然可以啊,不过如果代码特别多,另外弄一个procedure也没有多少意义,
毕竟线程大多用来处理简单而重复的工作。
 
TO Highpeak :
如果不用 Synchronize 調用 procedure ,那么,線程里是無法用到外邊Form的 VCL 的?
那怎么解決?!
 
可以用,但是不稳定:)非常容易出问题。
你弄两个procedure,处理界面的要Synchronize,运算的就不要了。
 
不用在线程中声明lGuage,可以这样:
procedure TPRThread.doSomething;
begin
form1.lGuage.Progress:=i;
end;
如果TPRThread 在一个单独的单元中,记得USE form1所在的单元。
 
我還是沒有想通,具體情況是這樣的
1 創建一個臨時表
2 計算臨時表的前10字段,
3 然后計算后10個段
4 將臨時表導出成EXCEL
5 再按其它的算法,計算后10字段
6 再導出Excel
問題是: 在計算的時候,由于需要很多一段時間(5分鐘左右),如果計算中然后切換窗口的話,
那么應用程式窗口就會刷新不出來,只有等計算完了之后,windows才會把窗口顯示完整.
因此我想:"用多線程來處理這個問題",請各位指點算法.
 
没有问题啊,在Execute中处理你这些任务,主线程会自动帮你“刷新”界面,
你只需要用Synchronize方法在适当的时候“更新”界面中的进度栏就可以了。
 
是的,我正在試,远帆兄的方法好像可行!好好去試試,有問題再請教各位啦!
結帳!!!!!!!!!!!!!!!<結完這次我就只有20分啦!>
 
后退
顶部