すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,125,044  昨日:000,000,099  本日:000,000,066
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 ランキング:本 - ビジネス・経済】

タイマーというとタイマーコントロールをすぐに思い浮かべると思いますが、スレッドタイマーというものが .NET では用意されています。
スレッドタイマーというのは指定された間隔で定期的にスレッドを発生させるタイマーでタイマーコントロールより軽いとされています。
今回はサンプルとしてタイマーでラベルを描画していますが、スレッドタイマーだと Invoke 呼び出しを行わなければいけないので本来ならこのような場合は迷わずタイマーコントロールを使用することをお勧めします。スレッドタイマーは Windows フォームを使用していない場合にタイマーコントロールの代わりに使用することが多いです。
タイマーの開始と停止
タイマーを開始するにはコンストラクタで時間を指定する方法と、Change メソッドで開始させる方法があります。どちらを使用する場合でも引数に dueTime、period を指定する必要があります。dueTime は タイマーを開始して最初のスレッドが実行される間での間隔で、period は2回目以降のスレッドが実行される間隔です。 dueTime=1000、period=5000 とした場合は、1秒後に最初のスレッド実行されて、以降5秒おきにスレッドが実行されます。すぐにスレッドを実行させたい場合は dueTime に 0 を指定します。
停止する場合は Change メソッドを使用して dueTime、period に Timeout.Infinite を指定します。

[VB]
' タイマ開始
_timer.Change(0, 1000)
' タイマ停止
_timer.Change(Timeout.Infinite, Timeout.Infinite)

[C#]
// タイマ開始
_timer.Change(0, 1000);
// タイマ停止
_timer.Change(Timeout.Infinite, Timeout.Infinite);
デットロックを起こすプログラム
Form5 に Label, Button をはりつけます。

Label:{label1]
TextAlign TopRight

Button:[button1]
Button:[button2]

VB[Form5.vb]
Imports System.Threading

Public Class Form5

    
' タイマ
    Private _timer As System.Threading.Timer

    
' カウンタ
    Private _count As Integer

    Public Sub New()

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

        
' タイマ作成
        _timer = New System.Threading.Timer(AddressOf TimerProc)

    
End Sub

    ' タイマコールバックイベント
    Private Sub TimerProc(ByVal state As Object)

        
' ラベル設定
        SetLabel(_count)

        
' カウンタ加算
        _count = _count + 1

    
End Sub

    ' ラベル描画イベント
    Private Delegate Sub delegate_SetLabel(ByVal count As Integer)
    
Private Sub SetLabel(ByVal count As Integer)
        
If (label1.InvokeRequired) Then
            ' メインスレッドで実行させる
            Dim callback = New delegate_SetLabel(AddressOf SetLabel)
            label1.Invoke(callback, count)
            
Exit Sub
        End If
        label1.Text = String.Format("{0}秒", count)
    
End Sub

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

        
' タイマ開始
        _timer.Change(0, 1000)

    
End Sub

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

        
' タイマ停止
        _timer.Change(Timeout.Infinite, Timeout.Infinite)

    
End Sub

End
 Class
C#[Form5.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 Form5 : Form
    {
        
// タイマ
        private System.Threading.Timer _timer;
       
        
// カウンタ
        private int _count = 0;

        
public Form5()
        {
            InitializeComponent();

            
// タイマ作成
            _timer = new System.Threading.Timer(TimerProc);

        }

        
// タイマコールバックイベント
        private void TimerProc(object state)
        {
            
// ラベル設定
            SetLabel(_count);

            
// カウンタ加算
            _count++;
        }

        
// ラベル描画メソッド
        private delegate void delegate_SetLabel(int count);
        
private void SetLabel(int count)
        {
            
if (label1.InvokeRequired)
            {
                
// メインスレッドで実行させる
                delegate_SetLabel callback = new delegate_SetLabel(SetLabel);
                label1.Invoke(callback, count);
                
return;
            }
            label1.Text = 
string.Format("{0}秒", count);
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            
// タイマ開始
            _timer.Change(0, 1000);

        }

        
private void button2_Click(object sender, EventArgs e)
        {
            
// タイマ停止
            _timer.Change(Timeout.Infinite, Timeout.Infinite);
        }
    }
}
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

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




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

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