VB.NET2008をWindows7HomePremium32bit版で質問です。

数ギガの容量がある、とある1つのフォルダについて ICSharpCode.SharpZipLib.Zip.FastZip で圧縮する
処理が必要になりました。

当然CreateZip実行中は、アプリが固まったようになるので、せめて処理中であることを
現状のWindow内の文字列を動かすことで表現させたいと考えています。
その為、 ICSharpCode.SharpZipLib.Zip.FastZipは別スレッドにさせて
メインウィンドウ内のLabelに対して文字アニメーションのループ処理をさせているのですが
その内容が反映されず困っています。

サンプルソースはコメント欄に記載しますので、アドバイスがいただけたら幸いです。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/12/14 15:27:41
  • 終了:2010/12/21 15:30:03

回答(1件)

id:SweetSmile1978 No.1

SweetSmile1978回答回数191ベストアンサー獲得回数292010/12/15 09:43:33

ポイント60pt

VB はむかし Access や Excel を使っていたときの VBA でしかしらないことと、

もう数年前なので記憶がはっきりしない状況での回答です。

ループ内で宣言している

Dim str4beat As String = ""

をループの中で宣言するのではなく

手前に出してはどうでしょう。

常に初期化されてしまっているような気がします。

id:halohalolin

SweetSmile1978さん、度々ありがとうございます。

実験的に手前に出しましたが、変化なしです。

2010/12/15 10:32:58
  • id:halohalolin
    以下がICSharpCode.SharpZipLib.Zip.FastZip実行中に、Window内の文字列を動かすプログラムです。
    vidMain内で、ICSharpCode.SharpZipLib.Zip.FastZipのCreateZipで圧縮しています。
    Dim宣言していない配列は、広域変数とします。
    よろしくお願いします。
     
     
     
    Private Function blnExportOriginalZipCompression(ByVal strExportFolder As String, ByVal strExportFileName As String, ByVal blnSwitchDelete As Boolean) As Boolean
    If Directory.Exists(strExportFolder) Then
      Try
        Dim ThreadZip As New Thread(New ThreadStart(AddressOf vidMain))
     
        vidSetting(strExportFileName, strExportFolder, blnSwitchDelete)
        ThreadZip.Start()
     
        Do
          Dim str4beat As String = ""
     
          int4beat = CInt(IIf(int4beat > 3, 0, int4beat + 1))
          For i As Integer = 0 To int4beat
            str4beat += "."
          Next
     
          lblNowCompressioning.Text = "圧縮中" & str4beat
          Update()
     
          Thread.Sleep(10000)
        Loop While blnRunning
     
        vidFinished()
        Return True
      Catch ex As Exception
        If Directory.Exists(strExportFileName) And blnSwitchDelete = CBool(enmDeleteAtFinished.DELETE) Then
          Directory.Delete(strExportFileName, True)
        End If
     
        blnRunning = False
     
        vidFinished()
        Return False
      End Try
    End If
     
    Return False
    End Function
  • id:halohalolin
    ちなみに上サンプルプログラムにおいて、blnRunningの値は
    関数vidSetting内にてTrueになり、
    Zip圧縮スレッドvidMainが終了するときにFalseになります。

    よろしくお願いします。
  • id:SweetSmile1978
    VBはソースが汚くて読みにくいのが難点ですね…。
    まだVBを使っている人がいるんだ、と驚いてしまいます。

    肝心の質問ですが、
    そもそも圧縮処理抜きにして
    文字列更新部分だけでは動作するんですか?
  • id:halohalolin
    > VBはソースが汚くて読みにくいのが難点ですね…。

    SweetSmile1978さん、ソースが汚い中でも返答下さりありがとうございます。

    今頂いたアドバイスに従って圧縮処理の代わりにSleepを入れてみたのですが、描画の書き換えは
    行われていませんでした。
    Loop処理の考え方自体が、間違っているのかもしれませんね。

    問題は、ではどうすりゃいいのかですが・・・。
  • id:SweetSmile1978
    すみません、誤解を招いたかもしれません。
    提示したコード限定で汚いということでなくて
    VB で書かれたコードはどれもそう感じてしまうんですよね。
    すみません。

    スレッドでの処理が終了したとき、
    文字列を動かす処理のループを抜けているかどうか確認できますか?
  • id:halohalolin
    SweetSmile1978さん、お付き合いいただきありがとうございます。

    > 文字列を動かす処理のループを抜けているかどうか確認できますか?

    抜けます!
    スレッドの終了時に、blnRunning = Falseを代入する処理は正常です。
  • id:halohalolin
    Update()の下に、Application.DoEvents()を挿入した場合
    メインウィンドウにおける文字アニメーションをさせたいLabelが書き換わるようになりました!

    ちなみに、同時にポップアップウィンドウに表示させている
    「圧縮中」の文字について、この方法と同じコードを利用してみたのですが
    こちらは一向に書き換わらず、デフォルト値のままです。

    なんとか書き換える方法をご存知の方、アドバイスを頂ければ幸いです。

    なお、今回の対応は以下のサイトを参考にしました。

    時間がかかる処理の進行状況をダイアログで表示するには? - .NET TIPS
    http://www.atmarkit.co.jp/fdotnet/dotnettips/181waitdlg/waitdlg.html

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません