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

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

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

Re[8]: 一定時刻での割り込み


(過去ログ 135 を表示中)

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

■79372 / inTopicNo.1)  一定時刻での割り込み
  
□投稿者/ 超初心者 (4回)-(2016/03/26(Sat) 20:56:41)

分類:[VB.NET/VB2005 以降] 

あくまでも基点は時計の00秒です。
その基点から30秒や1分、1分30秒 毎にある処理をしたいと思います。
どのようにすれば良いのか教えてください。

引用返信 編集キー/
■79374 / inTopicNo.2)  Re[1]: 一定時刻での割り込み
□投稿者/ shu (852回)-(2016/03/27(Sun) 01:51:02)
No79372 (超初心者 さん) に返信

Timerの使い方は分かるのでしょうか?

00秒からの30秒単位の補正をどのようにしたらよいか分からないということでしょうか?

後者であればTimerとスレッドの組み合わせを行うとよいと思います。
Timerイベントで現在の秒数を取得して別スレッドを起こしずれの分待機させて処理を行わせる
といった感じでしょうか?
またはTimer間隔を100ms程度にしておいて00秒,30秒のときに処理を行い他のときは処理をしないという
方法でもよいかと思います。
引用返信 編集キー/
■79377 / inTopicNo.3)  Re[2]: 一定時刻での割り込み
□投稿者/ 超初心者 (5回)-(2016/03/27(Sun) 23:22:53)
2016/03/27(Sun) 23:37:38 編集(投稿者)
No79374 (shu さん) に返信

ありがとうございます。

これは30秒毎にとある処理をしょうとするものです。
これで合ってるでしょうか?

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Do
            If Mid(DateTime.Now, 18, 2) = "00" Then       '時計の00秒になればスタート
                MessageBox.Show(DateTime.Now.ToString())  'ここでとある処理を実行
                System.Threading.Thread.Sleep(30000)      '30秒のスリープ
                MessageBox.Show(DateTime.Now.ToString())  'ここでとある処理を実行
            End If
        Loop
    End Sub
End Class

引用返信 編集キー/
■79378 / inTopicNo.4)  Re[3]: 一定時刻での割り込み
□投稿者/ shu (853回)-(2016/03/28(Mon) 07:24:34)
No79377 (超初心者 さん) に返信

こういう無限ループを使ってスリープさせる方法は
Windows上では使うべきではありません。Timerなどを
使うようにした方がよいです。
引用返信 編集キー/
■79382 / inTopicNo.5)  Re[4]: 一定時刻での割り込み
□投稿者/ 774RR (392回)-(2016/03/28(Mon) 10:48:23)
UI スレッド (イベントハンドラ) にて Sleep するということは、その間
・一切の操作に反応させない(してはいけない)
・一切の画面更新を行わない
というプログラマの意思表明であるため、そういう書き方はダメ
http://bbs.wankuma.com/index.cgi?mode=al2&namber=79158
典型的「応答無し」になる例だ。

自分でタイミングをコード記述するのでなく「タスクスケジューラ」でなんとかならないか考察してみよう。

引用返信 編集キー/
■79383 / inTopicNo.6)  Re[4]: 一定時刻での割り込み
□投稿者/ 超初心者 (6回)-(2016/03/28(Mon) 11:23:14)
No79378 (shu さん) に返信

ありがとうございます。

無限ループは禁じ手なのですね。
一応作ってみました。
ご指導の程お願いします。

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    'タイマーを開始
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Start()             '果たしてこれも要るのかは不明です。
        Timer1.Enabled = True
    End Sub
    'タイマーを停止
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Stop()              '果たしてこれも要るのかは不明です。
        Timer1.Enabled = False
    End Sub
    '時計の30秒毎にとある処理を実行
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If DateTime.Now.Second = 0 Or DateTime.Now.Second = 30 Then
            Timer1.Enabled = False
            MessageBox.Show(DateTime.Now.ToString())  'ここでとある処理を実行
            Timer1.Enabled = True
        End If
    End Sub
End Class

引用返信 編集キー/
■79384 / inTopicNo.7)  Re[5]: 一定時刻での割り込み
□投稿者/ 超初心者 (7回)-(2016/03/28(Mon) 11:32:15)
No79382 (774RR さん) に返信

ありがとうございます。

レスのタイミングが前後してしまったようです。
勉強させていただきます。

> UI スレッド (イベントハンドラ) にて Sleep するということは、その間
> ・一切の操作に反応させない(してはいけない)
> ・一切の画面更新を行わない
> というプログラマの意思表明であるため、そういう書き方はダメ
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=79158
> 典型的「応答無し」になる例だ。
>
> 自分でタイミングをコード記述するのでなく「タスクスケジューラ」でなんとかならないか考察してみよう。
>
引用返信 編集キー/
■79385 / inTopicNo.8)  Re[5]: 一定時刻での割り込み
□投稿者/ kiku (90回)-(2016/03/28(Mon) 11:59:41)
No79383 (超初心者 さん) に返信

Timer1.Intervalをいくつに設定するかを考える必要があります。

Timer1.Intervalを1000(1秒)に設定した場合、
ぴったり1秒間隔でイベントが発生しないため、
例えば下記のようなことが発生することが考えられます。
 前回、29秒900ミリ秒。
 今回、31秒100ミリ秒。
つまり、30秒にならない可能性が出てきます。

なので、Timer1.Intervalを1秒より充分小さい値にする必要があります。

引用返信 編集キー/
■79386 / inTopicNo.9)  Re[6]: 一定時刻での割り込み
□投稿者/ 774RR (393回)-(2016/03/28(Mon) 12:29:17)
組み込み系をやっているとこういうのが気になるのだが

DateTime.Now は毎回評価されるプロパティなので
> If DateTime.Now.Second = 0 Or DateTime.Now.Second = 30 Then
1回目の Second が 30 で、2回目の Second が 31 で、両方不成立になるというのはありうる。
再現性の低いバグっす。

どう直したらよいかを課題にしておこう。

引用返信 編集キー/
■79387 / inTopicNo.10)  Re[7]: 一定時刻での割り込み
□投稿者/ ルパン (1回)-(2016/03/28(Mon) 12:46:31)
単に30秒ごとに何かを実行するのであれば、
Timerのインターバルを30秒にすればいいだけなのですが、
時計の00秒を基準にする理由は何でしょうか?
Windowsのシステム時刻と別の何かがリンクしているのでしょうか?

また、時間に対してはどの程度の精度が必要なのでしょうか?
引用返信 編集キー/
■79388 / inTopicNo.11)  Re[8]: 一定時刻での割り込み
□投稿者/ 超初心者 (8回)-(2016/03/28(Mon) 14:17:33)
2016/03/29(Tue) 11:24:55 編集(投稿者)

改めて奥の深さを感じてます。
時計の00秒を基準にしてるのは他のPCも日本標準時を基準にしてるからです。
精度については正確に越したことはないですが1秒くらいの誤差はあっても特に問題はありません。
ありがとうございました。
これで解決とさせていただきます。

解決済み
引用返信 編集キー/
■79400 / inTopicNo.12)  Re[5]: 一定時刻での割り込み
□投稿者/ shu (856回)-(2016/03/30(Wed) 11:12:10)
2016/03/30(Wed) 11:12:22 編集(投稿者)

No79383 (超初心者 さん) に返信

> Timer1.Start() '果たしてこれも要るのかは不明です。
> Timer1.Enabled = True
どちらかというとStartだけの方がよいと思います。


> Timer1.Stop() '果たしてこれも要るのかは不明です。
> Timer1.Enabled = False
どちらかというとStopだけの方がよいと思います。
解決済み
引用返信 編集キー/
■79431 / inTopicNo.13)  Re[6]: 一定時刻での割り込み
□投稿者/ 超初心者 (9回)-(2016/04/01(Fri) 17:31:08)
No79400 (shu さん) に返信

ありがとうございます。

Timer1.Enabled は使わないようにします。

> どちらかというとStartだけの方がよいと思います。
> どちらかというとStopだけの方がよいと思います。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -