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

わんくま同盟

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

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

ツリー一括表示

システム時刻設定変更イベントにつて /usushio (19/10/23(Wed) 14:35) #92710
Re[1]: システム時刻設定変更イベントにつて /Hongliang (19/10/23(Wed) 15:04) #92711
  └ Re[2]: システム時刻設定変更イベントにつて /usushio (19/10/23(Wed) 18:45) #92716 解決済み
    └ Re[3]: システム時刻設定変更イベントにつて /Hongliang (19/10/23(Wed) 19:43) #92717
      └ Re[4]: システム時刻設定変更イベントにつて /usushio (19/11/07(Thu) 11:35) #92911 解決済み


親記事 / ▼[ 92711 ]
■92710 / 親階層)  システム時刻設定変更イベントにつて
□投稿者/ usushio (36回)-(2019/10/23(Wed) 14:35:06)

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

VisualStudio2017 VB言語で開発をしております。

Formロード時にシステム時刻が変更されたことを検知するためのイベントを置いて
時刻が変更されたらMessageBoxで表示するようにしているのですが、
MessageBoxが2つ表示されてしまいます。
動作的にシステム変更検知イベントが2回走っている状態です。
イベントが複数設定されていたり、
イベントが複数個所で呼び出されている可能性はあるのでしょうか。


Import Microsoft.Win32

Private Sub Form1_Load(ByVal sender As Object, e As System.EventArgs) Handles MyBase.Load
'AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferencesChanged
AddHandler SystemEvents.TimeChanged, AddressOf SystemEvents_TimeChenged
End Sub

Private Sub SystemEvents_TimeChenged(ByVal sender As Object, ByVal e As EventArgs)
MessageBox.Show("現在時刻:" & DateTime.Now.ToString())
End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
RemoveHandler SystemEvents.TimeChanged, New EventHandler(AddressOf SystemEvents_TimeChenged)
End Sub

よろしくお願いいたします。
[ □ Tree ] 返信 編集キー/

▲[ 92710 ] / ▼[ 92716 ]
■92711 / 1階層)  Re[1]: システム時刻設定変更イベントにつて
□投稿者/ Hongliang (907回)-(2019/10/23(Wed) 15:04:07)
1回の時刻変更でシステムから2回時刻変更通知が来るのは、バグか仕様かはともかく、そういうもののようです。
https://stackoverflow.com/questions/15052635/systemevents-timechanged-fires-twice
[ 親 92710 / □ Tree ] 返信 編集キー/

▲[ 92711 ] / ▼[ 92717 ]
■92716 / 2階層)  Re[2]: システム時刻設定変更イベントにつて
□投稿者/ usushio (38回)-(2019/10/23(Wed) 18:45:22)
No92711 (Hongliang さん) に返信
> 1回の時刻変更でシステムから2回時刻変更通知が来るのは、バグか仕様かはともかく、そういうもののようです。
> https://stackoverflow.com/questions/15052635/systemevents-timechanged-fires-twice


返答ありがとうございます。
そういうものなのですね...

Private timeFlag As Boolean = True

Private Sub SystemEvents_TimeChenged(ByVal sender As Object, ByVal e As EventArgs)
If timeFlag = True Then
MessageBox.Show("現在時刻:" & DateTime.Now.ToString())
timeFlag = False
Else
timeFlag = True
End If

今回はこのようにして対応したいと思います。

End Sub
解決済み
[ 親 92710 / □ Tree ] 返信 編集キー/

▲[ 92716 ] / ▼[ 92911 ]
■92717 / 3階層)  Re[3]: システム時刻設定変更イベントにつて
□投稿者/ Hongliang (908回)-(2019/10/23(Wed) 19:43:39)
NTPクライアントで調整された場合1回しか来ない場合があるなど、2回来る前提で書くのもよろしくないようです。
毎回Environment.TickCount64を確認して、前回のイベント呼び出しの時の値と差が1以下の場合は連続送信されたと判断する、とかそんな感じの判定になるでしょうか…。
[ 親 92710 / □ Tree ] 返信 編集キー/

▲[ 92717 ] / 返信無し
■92911 / 4階層)  Re[4]: システム時刻設定変更イベントにつて
□投稿者/ usushio (41回)-(2019/11/07(Thu) 11:35:14)
No92717 (Hongliang さん) に返信
> NTPクライアントで調整された場合1回しか来ない場合があるなど、2回来る前提で書くのもよろしくないようです。
> 毎回Environment.TickCount64を確認して、前回のイベント呼び出しの時の値と差が1以下の場合は連続送信されたと判断する、とかそんな感じの判定になるでしょうか…。


承知いたしました。
ありがとうございます。
解決済み
[ 親 92710 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -