我使用了线程压缩文件,FORM像死掉了一样! |
答題得分者是:aquarius
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 我使用了线程压缩文件,FORM像死掉了一样! 本来以为可以用多线程来压缩文件同时,FORM还可以用来操作其它功能; 但是我使用了线程,FROM的界面也照样象撕掉一样! 请各位帮我调试一下,谢谢! 程式参见: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34573你 thread 的用法不對呀!! 一進去就 Synchronize , 那和不用 THREAD 不是差不多.. 如果只是希望在壓縮文件過程中, FORM 還有反應. 那只要在壓縮過程中加上 application.processmessages ; 當然, 也不能用 ys.CopyFrom(inStream, 0); 這樣一行程式. 要先讀一部份到 BUFFER 中, 再寫入 STREAM , 像這樣 MaxBufSize:=32768 ; count:=inStream.Size ; if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count; GetMem(Buffer, BufSize); try while Count <> 0 do begin if Count > BufSize then N := BufSize else N := Count; Source.ReadBuffer(Buffer^, N); WriteBuffer(Buffer^, N); Dec(Count, N); application.processmessages ; end; finally FreeMem(Buffer, BufSize); end;...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: aquarius : 感谢您提供的方法, 不过我在压缩〉20MB的文件的时候,还是不能够让FORM有反应!并且,我希望在压缩的过程中使线程发挥作用! 希望给于指教!你是照我上頭的方式改嗎? 那樣的改法, 是每壓縮 32 KB, 就會去處理一下 WINDOWS MESSAGE, 這樣不管是壓多大的檔案, 應該都不會造成 FORM 沒有回應. 你講的這種狀況, 很像是保留了 ys.CopyFrom(inStream, 0); 只是在這前後加上 processmessages. 才會造成壓縮大檔案時無回應. ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
procedure Tthreadstream.compress_stream(var instream,outStream: TMemoryStream;standard:compress_stream_standard=0); var
ys: TCompressionStream;
MaxBufSize,count,BufSize,n:integer;
Buffer:pointer;
begin inStream.Position := 0; case standard of
1: ys := TCompressionStream.Create(clnone,OutStream);
2: ys := TCompressionStream.Create(clFastest,OutStream);
3: ys := TCompressionStream.Create(cldefault,OutStream);
4: ys := TCompressionStream.Create(clmax,OutStream);
else
ys := TCompressionStream.Create(clFastest,OutStream);
end; MaxBufSize:=32768 ;
count:=inStream.Size ; if Count > MaxBufSize then BufSize := MaxBufSize
else BufSize := Count; GetMem(Buffer, BufSize);
try
while Count <> 0 do
begin
if Count > BufSize then N := BufSize else N := Count;
inStream.ReadBuffer(Buffer^, N);
ys.WriteBuffer(Buffer^, N);
Dec(Count, N);
application.processmessages ;
end;
finally
FreeMem(Buffer, BufSize);
end; end; 这是根据您的方法,改过的!!!!
还是出现上述问题,请您讲我上传的程式修改一下; 使其具有真正的线程压缩功能,并且FORM不能死掉!!! 谢谢!
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: procedure Tthreadstream.compress_stream(var instream,outStream: TMemoryStream;standard:compress_stream_standard=0); var ys: TCompressionStream; MaxBufSize,count,BufSize,n:integer; Buffer:pointer; begin inStream.Position := 0; case standard of 1: ys := TCompressionStream.Create(clnone,OutStream); 2: ys := TCompressionStream.Create(clFastest,OutStream); 3: ys := TCompressionStream.Create(cldefault,OutStream); 4: ys := TCompressionStream.Create(clmax,OutStream); else ys := TCompressionStream.Create(clFastest,OutStream); end; MaxBufSize:=32768 ; count:=inStream.Size ; if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count; GetMem(Buffer, BufSize); try while Count <> 0 do begin if Count > BufSize then N := BufSize else N := Count; inStream.ReadBuffer(Buffer^, N); ys.WriteBuffer(Buffer^, N); Dec(Count, N); application.processmessages ; end; finally FreeMem(Buffer, BufSize); end; end; 这是根据您的方法,改过的!!!! 还是出现上述问题,请您讲我上传的程式修改一下; 使其具有真正的线程压缩功能,并且FORM不能死掉!!! 谢谢!再看了一下, 我知道你的問題在那兒了!! 你都是用 MemoryStream , 又去存取超過 20MB 的檔案. 這表示什麼, 這表示你記憶體用太多啦!! 不只是 FORM 不會動, 你整個系統應該都被拖住, 虛擬記憶體 SWAP 得太兇, 應該是硬碟狂轉, Windows 系統都沒反應. 把 MemoryStream 改成 FileStream 應該就沒問題了. ...
------
水瓶男的blog: http://791909.blogspot.com |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |