すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,125,058  昨日:000,000,099  本日:000,000,080
Loading
スレッド
.NET プログラミング
プロパティグリッド
印刷
リストボックス
スレッド
リストビュー
インストーラー
やってみよう!

できるVisual Studio 2015 Windows /Android/iOS アプリ対応

独習C# 第3版

VisualBasic2013パーフェクトマスター (Perfect Master SERIES)

プログラミング.NET Framework 第4版 (Microsoft Press)

VisualBasic2013逆引き大全555の極意

猫でもわかるWindowsプログラミング 第4版 (猫でもわかるプログラミング)

VisualC#2013逆引き大全555の極意

独自スレッド管理② 最終更新:2010/07/15
【Amazon ランキング:本 - 資格・検定・就職】

今回は、前回作成した独自のスレッド管理クラスを実際に使った画面を作って見ようと思います。
ワーカークラス
前回作ったワーカーベースクラスを継承してワーカークラスを作成します。
VB[WorkerClass2.vb]
Imports System.Threading

' ワーカークラス2
Public Class WorkerClass2 : Inherits WorkerBaseClass

    
Private _progress As Integer = 0

    
' ステータスプロパティ
    Public ReadOnly Property Status() As String
        Get
            Dim sts As String = String.Empty

            
Select Case WorkerStatus
                
Case worker_status.Standby
                    sts = 
"待機中..."

                Case worker_status.Running
                    sts = 
String.Format("処理中 {0}%", _progress)

                
Case worker_status.End
                    sts = 
"処理終了"

                Case worker_status.Error
                    sts = 
"処理エラー"

                Case worker_status.Aborted
                    sts = 
"強制終了"

            End Select

            Return sts

        
End Get
    End Property

    ' ワーカー処理
    Protected Overrides Sub WorkerProcess()

        
For i As Integer = 0 To 100
            _progress = i
            System.Threading.Thread.Sleep(100)
        
Next

    End Sub

End
 Class
C#[WorkerClass2.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ThreadCS
{
    
// スレッドワーカークラス
    public class WorkerClass2 : WorkerBaseClass
    {
        
private int _progress = 0;

        
// ステータスプロパティ
        public string Status
        {
            
get
            {
                
string sts = string.Empty;

                
switch (WorkerStatus)
                {
                    
case worker_status.Standby:
                        sts = 
"待機中...";
                        
break;

                    
case worker_status.Running:
                        sts = 
string.Format("処理中 {0}%", _progress);
                        
break;

                    
case worker_status.End:
                        sts = 
"処理終了";
                        
break;

                    
case worker_status.Error:
                        sts = 
"処理エラー";
                        
break;

                    
case worker_status.Aborted:
                        sts = 
"強制終了";
                        
break;
                }
                
return sts;
            }
        }

        
// ワーカー処理
        protected override void WorkerProcess()
        {
            
for (int i = 0; i <= 100; i++)
            {
                _progress = i;
                System.Threading.
Thread.Sleep(100);
            }
        }
    }
}
スレッド管理クラス
Form3 に ListBox, Button,Timer をはりつけます。
プロパティの内容はすべてデフォルトです。

ListBox:[ListBox1]
Button:[button1]
Button:[button2]
Timer:[Timer1]

VB[Form3.vb]
Public Class Form3

    
Private _workerList As List(Of WorkerClass2)

    
' スレッド管理クラス
    Private _threadMng As ThreadManager

    
Public Sub New()

        
' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        
' InitializeComponent() 呼び出しの後で初期化を追加します。

        ' インスタンス作成
        _workerList = New List(Of WorkerClass2)()

        
' スレッド管理クラス
        _threadMng = New ThreadManager()

    
End Sub

    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        
Handles MyBase.Load

        
' タイマー開始
        Me.timer1.Interval = 500
        
Me.timer1.Start()

    
End Sub

    Private Sub Form3_FormClosed( _
        
ByVal sender As ObjectByVal e As System.Windows.Forms.FormClosedEventArgs) _
        
Handles Me.FormClosed

        
' スレッド強制終了
        _threadMng.Abort()

    
End Sub

    Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        
Handles button1.Click

        
' ワーカークラス作成してリストに登録
        Dim wk As WorkerClass2 = New WorkerClass2()
        _workerList.Add(wk)

        
' スレッド管理クラスに登録する
        _threadMng.AddWorkerThread(wk)

    
End Sub

    Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        
Handles button2.Click

        
' スレッド強制終了
        _threadMng.Abort()

    
End Sub

    Private Sub timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        
Handles timer1.Tick

        
Me.timer1.Enabled = False

        Try
            ' ちらつき防止!
            Me.listBox1.BeginUpdate()

            
Dim num As Integer = 1

            
Me.listBox1.Items.Clear()
            
For Each wk As WorkerClass2 In _workerList
                
' リストボックス追加
                Me.listBox1.Items.Add( _
                    
String.Format("{0:00}:{1}", _
                    num, wk.Status))
                num = num + 1
            
Next

        Finally
            ' ちらつき防止!
            Me.listBox1.EndUpdate()
        
End Try

        Me.timer1.Enabled = True

    End Sub

End
 Class
C#[Form3.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ThreadCS
{
    
public partial class Form3 : Form
    {
        
private List<WorkerClass2> _workerList = null;

        
// スレッド管理クラス
        private ThreadManager _threadMng = null;

        
public Form3()
        {
            InitializeComponent();
            
            
// インスタンス作成
            _workerList = _workerList = new List<WorkerClass2>();
            _threadMng = 
new ThreadManager();

        }

        
private void Form3_Load(object sender, EventArgs e)
        {
            
// タイマー開始
            this.timer1.Interval = 500;
            
this.timer1.Start();
        }

        
private void Form3_FormClosed(object sender, FormClosedEventArgs e)
        {
            
// スレッド強制終了
            _threadMng.Abort();
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            
// ワーカークラス作成してリストに登録
            WorkerClass2 wk = new WorkerClass2();
            _workerList.Add(wk);

            
// スレッド管理クラスに登録する
            _threadMng.AddWorkerThread(wk);

        }

        
private void button2_Click(object sender, EventArgs e)
        {
            
// スレッド強制終了
            _threadMng.Abort();
        }

        
private void timer1_Tick(object sender, EventArgs e)
        {
            
this.timer1.Enabled = false;

            
try
            {
                
// ちらつき防止!
                this.listBox1.BeginUpdate();

                
int num = 1;

                
this.listBox1.Items.Clear();
                
foreach (WorkerClass2 wk in _workerList)
                {
                    
// リストボックス追加
                    this.listBox1.Items.Add(
                        
string.Format("{0:00}:{1}",
                        num, wk.Status));
                    num++;
                }
            }
            
finally
            {
                
// ちらつき防止!
                this.listBox1.EndUpdate();
            }

            
this.timer1.Enabled = true;
        }
    }
}
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

【楽天 ランキング:スマートフォン】


【広告】
  • 国内宿・ホテル予約なら、るるぶトラベル!
  • 旅ならるるぶトラベル
  • JTB


  • このサイトはフリーソフトのMerge HTMLで作成されています。
    このサイトはリンクフリーです。

    ページの先頭に戻る Copyright© 2010-2015 Jun.Shiozaki All rights reserved.