アクセス数 累計:000,125,044 昨日:000,000,099 本日:000,000,066
|
|
|
|
【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]
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. |
|
|
|