|
スレッドから参照する変数の扱いについてですが、 皆様のご指摘を反映して以下のようにしました。 問題ないでしょうか。 アクセスする場合は必ずプロパティを使用することにし、 プロパティ内でロックしました。
*本修正をいれても、なちゃさんの予想通り、今回の件は解消されていません。 (メイン処理でSleepしても、スレッド処理が実行されていないようです。)
'変数を全てプライベートに変更する。 Private Shared _LockObject As New Object Private Shared poolCount_start As Integer = 0 '以前のソースのstartです。 Private Shared poolCount_end As Integer = 0 '以前のソースのendです。 Private Shared batchCancelFlg As Boolean = False
'上記のメンバにアクセスする場合は、必ず以下のプロパティでアクセスする。 Public Shared Property ProBatchCancelFlg As Boolean Get SyncLock _LockObject Return batchCancelFlg End SyncLock End Get Set(ByVal value As Boolean) SyncLock _LockObject batchCancelFlg = value End SyncLock End Set End Property
Public Shared Property ProPoolCount_start As Integer Get SyncLock _LockObject Return poolCount_start End SyncLock End Get Set(ByVal value As Integer) SyncLock _LockObject poolCount_start = poolCount_start + value End SyncLock End Set End Property
Public Shared Property ProPoolCount_end As Integer Get SyncLock _LockObject Return poolCount_end End SyncLock End Get Set(ByVal value As Integer) SyncLock _LockObject poolCount_end = poolCount_end + value End SyncLock End Set End Property
>片桐さん
BeginInvokeについてはあまり詳しくはないのですが、 クリックイベントはスレッド処理の完了に関わらず完了しています。 (完了していないと、呼び出し元のフォームに操作が戻りませんよね?)
また、今回のスレッドの最大数は10件と設定しています。 System.Threading.ThreadPool.SetMaxThreads(10,10)
10件以内であれば、スレッド処理は平行して実行されています。 10件以上印刷処理を繰り返した場合は、プールにたまっています。 (12件同時に印刷要求を出した場合は、2件がプールにたまります。)
startは、スレッドプールに登録する時に加算し、 endは、スレッド処理終了時に加算するので、 startとendは常に同じにはなりません。 (ここのカウントはデバックモードで確認していますが、 うまくいっているようです。)
|