全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1488
推到 Plurk!
推到 Facebook!

我使用了线程压缩文件,FORM像死掉了一样!

答題得分者是:aquarius
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-24 18:05:13 IP:61.155.xxx.xxx 未訂閱
我使用了线程压缩文件,FORM像死掉了一样! 本来以为可以用多线程来压缩文件同时,FORM还可以用来操作其它功能; 但是我使用了线程,FROM的界面也照样象撕掉一样! 请各位帮我调试一下,谢谢! 程式参见: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34573
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-24 23:22:01 IP:61.230.xxx.xxx 未訂閱
引言: 我使用了线程压缩文件,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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-25 07:35:01 IP:61.155.xxx.xxx 未訂閱
aquarius : 感谢您提供的方法, 不过我在压缩〉20MB的文件的时候,还是不能够让FORM有反应!并且,我希望在压缩的过程中使线程发挥作用! 希望给于指教!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-25 08:19:38 IP:61.230.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-25 08:47:11 IP:61.155.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-25 11:18:52 IP:211.23.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-25 15:12:21 IP:61.155.xxx.xxx 未訂閱
aquarius 兄: 不知道您是否试验过----还是不行的,我想让它具有多线程压缩的功能;像WINRAR,WINZIP之类的功能,我想它门在压缩大文件的时候,并没有将系统或FORM死掉吗!!! 谢谢!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-25 15:44:55 IP:211.23.xxx.xxx 未訂閱
引言: aquarius 兄: 不知道您是否试验过----还是不行的,我想让它具有多线程压缩的功能;像WINRAR,WINZIP之类的功能,我想它门在压缩大文件的时候,并没有将系统或FORM死掉吗!!!
唉呀! 本來想偷個懶, 用看的就把問題看出來.... 嗯, 這兩天找個空檔寫個範例放到發表區去好了..... 不過不要期望太大..... 也可能偷懶沒寫出來.....呵呵... ...
------
水瓶男的blog: http://791909.blogspot.com
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-25 16:05:51 IP:61.155.xxx.xxx 未訂閱
aquarius 兄: 谢谢了! 可否顺便帮我解决一下,关于怎么设置线程的全面优先级? 的问题 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34596 还有请你顺便举个咧子,是关于threadvar的,我感觉threadvar好象 没什么大用,可能是我能力不够,请aquarius 兄指教!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-26 18:47:47 IP:211.23.xxx.xxx 未訂閱
已經將範例上傳, 去看看吧! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34679 threadvar HELP 上都有寫呀. 不知怎麼用... 那就先不要用呀... 呵... 反正遇到問題, 非用不可時再來研究吧!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-27 08:37:22 IP:61.155.xxx.xxx 未訂閱
多谢@
系統時間:2024-05-10 21:30:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!