画像ファイル
画像ファイル BackgroundWorkerの魅力(2)
VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル

マルチスレッドを使わないタイマー
前回書いたマルチスレッドを使ったタイマーを、ほぼ同じ仕様でマルチスレッドを
使用しないで書いてみよう。(前のコードと同じ部分を一部省略してある)

コードの解説
殆ど何も違わない様に見えるがBackgroundWorker1_DoWorkの代わりに、繰り返し処理をTimeLoopと言う
関数で処理している。
マルチスレッドを使用しないので、Loop内から直接、ラベルに時間を表示することが 可能になっている。
実際のコードを下でダウンロードできるので試して頂きたい。
実際に実行してみた結果も殆どマルチスレッドのタイマーと変わりがない様に思われる。
よく見て欲しい、実際に大きな違いが有る。
・Private Sub SetLabelTime(ByVal txtTime As String)関数の中に
・My.Application.DoEvents()
という一行が有る、実はこれが大きな違いなのだ、仮にこの行をコメントアウト
してみて欲しい、タイマーの数字を更新しないばかりか、画面が固まってしまう、
タスクマネージャーの出動である。
これは何故か、このコードはマルチスレッドを使用していない為、Loopでの仕事が
忙しく、画面や、ボタンに応答している暇が無いのである。
その為にMy.Application.DoEvents()を入れて、Windowsに溜まった仕事をさせるのである。
マルチスレッドの場合は、実際に書き込むのはLoopを処理しているスレッドではなく、メインの
スレッドで有った、その為にこの処理が不要となったのだ。
今回のプログラムは、ストップウォッチなので、表示一回事にMy.Application.DoEvents()を入れてある、
つまり表示一回事に、ボタンの取り込みが可能となるが、ループでファイルを読み込み、同時に
処理をするような場合は毎回My.Application.DoEvents()を入れると動作が遅くなるし、
何回かに一回My.Application.DoEvents()を入れるのでは、ボタンの押下の反応が鈍くなってしまう。
その辺がマルチスレッドとは根本的に違うのである。

VB2005 マルチスレッドを使わないタイマー のソースコード
Option Strict On
Imports System.Threading
Public Class Fomtimer
'タイマー構造体の状態変数に使用
Private Enum eTime
eStart 'スタート
eStop 'ストップ
eLap 'ラップ 
eEnd 'エンド
End Enum
'タイマー構造体
Private Structure sTimer
Dim timeSatrt As DateTime 'スタート時間を保持
Dim intStatus As Integer '現在の状態を保持(状態変数)
Shared colBright As Color = Color.Lime 'LEDインジケーターの明るい色
Shared colDark As Color = Color.DarkGreen 'LEDインジケーターの暗い色
End Structure
Private myTimer As New sTimer
'-------------------------
'フォームのロード時
'-------------------------
Private Sub Fomtimer_Load(ByVal sender As System.Object, _
ByVal
e As System.EventArgs) _
Handles MyBase.Load
'ストップ状態に設定
myTimer.intStatus = eTime.eStop
'ボタンのEnable設定
SetButEnable()
End Sub
Private Sub Fomtimer_Disposed( _
ByVal
sender As Object, ByVal e As System.EventArgs) _
Handles Me.Disposed
'ループが終了しない場合に再度ループを脱出させる
myTimer.intStatus = eTime.eEnd
End Sub
'-------------------------
'スタートボタン押下
'-------------------------
Private Sub But_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles _
ButStart.Click, _
ButStop.Click, _
ButLap.Click, _
ButEnd.Click
'-------------------------------
'動作説明
'ボタンの一括処理
'-------------------------------
If sender.Equals(ButStart) Then
'スタートボタン押下
'Lapの場合はスタート時間をクリアーしない 
If myTimer.intStatus <> eTime.eLap Then
myTimer.timeSatrt = Now
End If
'ステータスのセット
myTimer.intStatus = eTime.eStart
SetButEnable()
TimeLoop()
Else
If sender.Equals(ButStop) Then
'ストップボタン押下
myTimer.intStatus = eTime.eStop
ElseIf sender.Equals(ButLap) Then
'ラップボタン押下
myTimer.intStatus = eTime.eLap
ElseIf sender.Equals(ButEnd) Then
'エンドボタン押下
myTimer.intStatus = eTime.eEnd
End If
'ボタンEnable,Desableの処理
SetButEnable()
End If
End Sub
'ラベルに時間を書き込む
Private Sub SetLabelTime(ByVal txtTime As String)
If myTimer.intStatus = eTime.eStart Then
LblTimer.Text = txtTime
End If
LblTime.Text = Format(Now, "hh:mm:ss")
'これは必要、無いと表示しない
My.Application.DoEvents()
End Sub
Private Sub TimeLoop()
'経過時間
Dim tsTime As TimeSpan
Dim strTime As String
'BackgroundWorkerのキャンセルがリクエストされたら抜ける
Do
'1msecのウエイト、CPUの使用率を下げる
System.Threading.Thread.Sleep(1)
'スタート時間からの経過時間
tsTime = DateTime.Now.Subtract(myTimer.timeSatrt)
'経過時間を文字列に直す
strTime = Format(tsTime.Hours, "00") _
& ":" & Format(tsTime.Minutes, "00") _
& ":" & Format(tsTime.Seconds, "00") & ":" _
& Format(tsTime.Milliseconds, "000")
'書き込み要求
SetLabelTime(strTime)
If myTimer.intStatus = eTime.eEnd Then
Exit Do
End If
Loop
End Sub
Private Sub SetButEnable()
'-------------------------------
'動作説明
'ボタンのEnable,Desableとインジケーターの色をセットする
'-------------------------------
'省略
End Sub
End Class
画像ファイル