###前提・実現したいこと
ボタンクリック後、数日間稼働し続けるWindowsフォームアプリケーションをVB.NETで作成しております。
ユーザーがタイトルバーをクリックして、アプリケーションの位置を変更したりしても、プログラムが動くようにしたいです。
###発生している問題・エラーメッセージ
作成途中で、アプリケーションのタイトルバーをクリックすると、メインスレッドが動いていないことに気づきました。
メインスレッドの処理を、別のスレッドとして作成して、メインスレッドではスレッドを新しくすれば、うまくいくかもしれないとは思ったのですが、
VB.NETを初めて1か月の自分にはかなり厳しいと感じました。
プロパティ等をいじることによって、これを防ぐことはできないのでしょうか?
###該当のソースコード
VB.NET
1 2Dim sw As New Stopwatch() 3 'ストップウォッチスタート 4 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 5 sw.Start() 6 7 8 End Sub 9 10 'ストップウォッチのミリ秒の表示 11 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 12 13 System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Highest 14 While True 15 16 If sw.ElapsedMilliseconds > 200 Then 17 'フォームに出力 18 Label1.Text = sw.ElapsedMilliseconds.ToString 19 End If 20 '1秒経過すると、csvに出力して、ストップウォッチをリスタート 21 If sw.ElapsedMilliseconds > 1000 Then 22 sw.Stop() 23 counter += 1 24 textFile = New IO.StreamWriter(csvname, True, System.Text.Encoding.Default) 25 'ストップウォッチのミリカウントとカウンターを出力 26 textFile.WriteLine(sw.ElapsedMilliseconds.ToString & "," & counter.ToString) 27 textFile.Close() ' -- StreamWriter を閉じて 28 textFile.Dispose() ' -- StreamWriter を解放 29 sw.Restart() 30 End If 31 My.Application.DoEvents() 32 End While 33 34 End Sub 35 36 'ストップウォッチのリスタート 37 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 38 39 sw.Stop() 40 sw.Restart() 41 End Sub
###試したこと
このようなストップウォッチの経過時間を表示するプログラムの場合、タイトルバーをクリックしている間は、ストップウォッチは進んでいるようですが、
Label1.Textは更新されず、アプリケーション画面の更新がされません。
###補足情報(言語/FW/ツール等のバージョンなど)
少しだけマルチスレッドにするとどうなるか試してみましたが、時間的にも厳しいため、今回はマルチスレッド処理をしない解決策をご教授いただけると幸いです。
よろしくお願いいたします。
###以下、マルチスレッドでためしたこと
プログレスバーが1からすすんでいって100になると、ボタンが押せるようになるプログラムで、スレッドを作成した場合、
アプリケーションの見た目上は95くらいで、内部的には100になっていて、ボタンが押せるようになっていました。
VB.NET
1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Highest 3 Button1.Enabled = False 4 'Dim sw As New Stopwatch() 5 Dim t As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf LongTask)) 6 t.Start() 7 Button1.Enabled = True 8 End Sub 9 Private Delegate Sub UpdateProgressBarDelegate(ByVal val As Integer) 10 Private Sub UpdateProgressBar(ByVal val As Integer) 11 ProgressBar1.Value = val 12 If val = 100 Then 13 Button1.Enabled = True 14 End If 15 16 End Sub 17 Sub LongTask() 18 Dim i As Integer 19 For i = 0 To 100 20 Threading.Thread.Sleep(100) 21 ProgressBar1.BeginInvoke( 22 New UpdateProgressBarDelegate(AddressOf UpdateProgressBar), i) 23 Next 24 End Sub

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/02 02:08