すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,101,834  昨日:000,000,137  本日:000,000,141
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 ランキング:ゲーム - ダウンロード】

ここまで SyncLock、ReaderWriterLock と説明してきましたが、最後にもう一つ Monitorクラスを説明します。 Monitor クラスもほかのロックと同様にオブジェクトに対して排他ロックを行うことができます。Monitor クラスがほかと異なるところは TryEntor でロックを試行して結果を戻り値で true/false で返すことです。SyncLock のように処理をブロックしたり、ReaderWriter のように例外をスローしないので、ロックできない場合にそのリカバリ処理をスマート記述することが可能です。
今まで説明したロックの特徴を下記にまとめましたので状況に応じて使い分けてください。


ロック
Monitor クラスでロックを行うには Monitor.Enter を使用します。また TryEntor でタイムアウト時間を指定することもできます。その際はロックできたかどうかを bool 値で返します。
[VB]
// ロック
Monitor.TryEnter();
// タイムアウト指定のロック
Monitor.TryEnter(_lockObj, 1000);
// ロック解除
Monitor.Exit(_lockObj);

[C#]
' ロック
Monitor.TryEnter()
' タイムアウト指定のロック
Monitor.TryEnter(_lockObj, 1000)
' ロック解除
Monitor.Exit(_lockObj)
フォームの作成
Form1 に Button, ProgressBar,Timer をはりつけます。
プロパティの内容はすべてデフォルトです。

Button:[Button1]
ProgressBar:[ProgressBar1]
Timer:[Timer1]

VB[Form1.vb]
Imports System.Threading

Public Class Form1

    
Private _progressValue As Integer = 0
    
Private _lockObj As Object = New Object()

    
Public Sub New()

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

        
' プログレスバー更新タイマー開始
        timer1.Interval = 200
        timer1.Enabled = 
True

    End Sub

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

        
' スレッド開始
        Dim th As Thread = New Thread(AddressOf ThreadProc)
        th.Start()

    
End Sub

    ' スレッド処理
    Private Sub ThreadProc()

        
Try
            While (True)
                
' ロックに成功したら true
                If (Monitor.TryEnter(_lockObj, 1000)) Then

                    Console.WriteLine("ロック成功")

                    
For i As Integer = 0 To 10
                        
'プログレスの値加算
                        _progressValue = i * 10
                        Thread.Sleep(1000)
                    
Next
                    Exit While
                Else
                    Console.WriteLine("ロック失敗")
                
End If
            End While

        Finally
            ' ロック解除
            Monitor.Exit(_lockObj)
        
End Try

    End Sub

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

        
' プログレスバー更新
        Me.progressBar1.Value = _progressValue

    
End Sub
End
 Class
C#[Form1.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;
using System.Threading;

namespace ThreadCS
{
    
public partial class Form1 : Form
    {
        
private int _progressValue = 0;
        
private object _lockObj = new object();

        
public Form1()
        {
            InitializeComponent();

            
// プログレス更新タイマー開始
            timer1.Interval = 200;
            timer1.Enabled = 
true;
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            
// スレッド開始
            Thread th = new Thread(ThreadProc);
            th.Start();
        }

        
// スレッド処理 
        private void ThreadProc()
        {
            
try
            {
                
while (true)
                {
                    
// ロックに成功したら true
                    if (Monitor.TryEnter(_lockObj, 1000))
                    {
                        
Console.WriteLine("ロック成功");

                        
for (int i = 0; i <= 10; i++)
                        {
                            
// プログレスの値加算
                            _progressValue = i * 10;
                            
Thread.Sleep(1000);
                        }
                        
break;
                    }
                    
else
                    {
                        
Console.WriteLine("ロック失敗");
                    }
                }
            }
            
finally
            {
                
// ロック解除
                Monitor.Exit(_lockObj);
            }
        }

        
// プログレスバーを更新するタイマー
        private void timer1_Tick(object sender, EventArgs e)
        {
            
// プログレスバー更新
            this.progressBar1.Value = _progressValue;
        }
    }
}
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

【楽天 ランキング:パソコン・周辺機器 - ネットワーク機器】




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

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