C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: スレッドタイマが途中でとまる?


(過去ログ 27 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■12755 / inTopicNo.1)  スレッドタイマが途中でとまる?
  
□投稿者/ mai (1回)-(2008/01/17(Thu) 02:00:44)

分類:[.NET 全般] 

VB.NET2005で開発をしています。
スレッド関連がよくわからなかったため、質問させていただきます。

スレッドタイマを使って処理をしていたら、なぜか途中でとまってしまいます。
ソースは次のようになります。

Imports System
Imports System.Threading

Public Class Form1
Delegate Sub setLabel(ByVal i As Integer)

Private value As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Timer As New TimerCallback(AddressOf TimerProcess)
Dim timer1 As New Timer(Timer, Nothing, 500, 10)
End Sub

Private Sub TimerProcess(ByVal state As Object)
Dim dlg As New setLabel(AddressOf insertText)

value += 1
Me.Invoke(dlg, New Object() {value})
End Sub

Private Sub insertText(ByVal i As Integer)
Label1.Text = i.ToString
End Sub
End Class

ラベルのテキストを随時更新しています。
私の環境だと、260くらいで画面の更新がとまってしまいました。
スレッドタイマもスレッドプールを使用したタイマ・・・と記述がありましたが、
スレッドプールがいっぱいになっているのでしょうか?
何か調査する方法がありましたら、よろしくお願いします。

引用返信 編集キー/
■12757 / inTopicNo.2)  Re[1]: スレッドタイマが途中でとまる?
□投稿者/ Azulean (12回)-(2008/01/17(Thu) 07:37:08)
> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
> Dim Timer As New TimerCallback(AddressOf TimerProcess)
> Dim timer1 As New Timer(Timer, Nothing, 500, 10)
> End Sub

http://msdn2.microsoft.com/ja-jp/library/system.threading.timer.aspx
 Timer を使用している間は、このクラスへの参照を保持しておく必要があります。
 他のマネージ オブジェクトと同様、まったく参照されていない場合、Timer はガベージ コレクションの対象となります。
 Timer がアクティブであっても、ガベージ コレクションの対象から除外されることはありません。

これのことではないのでしょうか?
Form1_Loadを抜けた時点でtimer1変数の参照は失われているため、ガベージ コレクションによってTimerが消えるのではないかと。
引用返信 編集キー/
■12758 / inTopicNo.3)  Re[2]: スレッドタイマが途中でとまる?
□投稿者/ mai (2回)-(2008/01/17(Thu) 09:51:14)
Azuleanさん

ご指摘ありがとうございます。ズバリ、それだと思います。
参照をPrivate宣言にしたところ、とまることなく動作するようになりました。
本当にありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -