質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

4回答

3696閲覧

Threading.TimerのコールバックでDataTableを更新してもコントロールに反映されない

kaktuswald

総合スコア11

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/01/30 08:43

Visual Studio 2012
.NET Framework4.5

以下のコードにて、Tickが走ってもListBoxの表示に"B"が反映されません。
別スレッドだからだという気はしますが、どうしたら良いかわかりません。

何か基本的な知識が不足しているのかもしれませんが、よろしくお願いいたします。

Public Class Form
Private test As New Class1

Public Sub New() InitializeComponent() ListBox.DataSource = test.data End Sub

End Class

Public Class Class1
Public data As New DataTable

Public Sub New() data.Columns.Add("Display") push("A") Dim timer As New System.Threading.Timer(AddressOf Tick, Me, 1000, 0) End Sub Public Sub push(disp As String) Dim row As DataRow = data.NewRow row("Display") = disp data.Rows.InsertAt(row, 0) End Sub Public Sub Tick(stateInfo As Object) push("B") End Sub

End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

普通非同期処理ではform内のコントロールを操作する場合,UIスレッドにinvokeする必要があります。これはUIスレッドしかControlへの参照を保持していないからです。以下にコード例を挙げます。

Public Sub Tick(stateInfo As Object) Invoke (New Action(Of String)(AddressOf push) ,New Object(){"B"} ) End Sub

私がC#ユーザーであるためC#で実行できるものをVBに直したため,このコードは動作しないかも知れませんが,必要なことは,Invokeの引数にDelegateと引数をObject型の配列で渡すことです。Action型は暗黙にDelegateにキャストできるので,例では,Action型を使用しています。

akabeiさんの言うようにSystem.Windows.Forms名前空間のTimerをつかうのであれば,勝手にinvokeを行ってくれます。

投稿2016/04/12 16:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Timerコントロール(System.Windows.Forms.Timer)を使用してみてはいかがでしょうか?
別スレッドにならなかったと思います。

投稿2016/04/12 15:37

akabei

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

別スレッドだからだという気はしますが、どうしたら良いかわかりません。

とりあえず原因は判明しました。

解決していると思っているなら別にいいですが..

System.Threading.Timerはスレッド・プールにキューイングされて実行されるため、System.Threading.TimerはTimerクラスのインスタンスを生成したスレッドとは別のスレッドで実行される

投稿2016/01/30 19:28

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ビルド済みの実行ファイルを直接走らせたら正常に表示されました。

VSホスト上で走らせていたから表示されなかったということなのかわかりませんが、
とりあえず原因は判明しました。

何か設定でこの挙動の違いをなくすことはできるのでしょうか?

投稿2016/01/30 09:20

編集2016/01/30 09:21
kaktuswald

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問