|
>なちゃさん
ソースコードを掲載いたします。
スレッド印刷クラス
Public Class Print
'メンバ変数
Public Shared start As Integer = 0 'プール総数
Public Shared end As Integer = 0 'プール処理済み数
Public Shared batchCancelFlg As Boolean = False '何もしないか判定(終了時にオンにする。)
'スレッドプールへの追加処理(メイン処理から呼ばれる)
Public Sub Run
' ThreadMethodをスレッドプールで実行できるようにWaitCallbackデリゲートを作成
Dim waitCallback As New System.Threading.WaitCallback(AddressOf BatchPrintRun)
' スレッドプールに登録
System.Threading.ThreadPool.QueueUserWorkItem(waitCallback)
start = start + 1
End Sub
'印刷処理(スレッドで実行する処理)
Private Sub BatchPrintRun
Try
If batchCancelFlg = False Then
'印刷処理の実行
XXXXX
XXXXX
'印刷をキャンセルする場合
If batchCancelFlg = True Then
'印刷のキャンセル処理
XXXXX
XXXXX
End If
End If
Catch
Finally
SyncLock Me
end = end + 1
End SyncLock
End Try
End Sub
End Class
'メインフォーム
Public Class Main
'クロージングイベント
Private Sub Main_FormClosing( ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles
MyBase.FormClosing
'印刷中の場合
If Print.start <> Print.end Then
'閉じますか?ダイアログでOKが選択された場合
If showMsgDialog("XXX") = Windows.Forms.DialogResult.OK Then
'スレッドの終了処理
Print.batchCancelFlg = True 'スレッドプールの処理を終了させる。
Do Until Print.start = Print.end 'スレッドプールの全ての処理が終わるまで待機する。
System.Threading.Thread.Sleep(1000)
Loop
'閉じますか?ダイアログでキャンセルが選択された場合
Else
e.Cancel = True
End If
End If
End Sub
'印刷要求(印刷ボタンが押された場合)
Private Sub MainPrint_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MainPrint.Click
Dim PrintInst As New Print
PrintInst.Run
End Sub
End Class
上記のように実装しています。(公開用に非常に簡素に書き換えていますがやっていることは同じです。)
|