2

ここでは、時間変数を 0 に初期化し、StopWatchミリ秒をカウントしDispatcherTimerて UI を更新するために使用します

Imports System.Threading
Imports Windows.UI.Xaml

Dim dt As DispatcherTimer = New DispatcherTimer
Dim dd As Integer = 0
Dim mm As Integer = 0
Dim hh As Integer = 0
Dim ss As Integer = 0
Dim ms As Integer = 0
Dim stopwatch As System.Diagnostics.Stopwatch = New System.Diagnostics.Stopwatch

Private Sub ontimertick()
        ms = stopwatch.ElapsedMilliseconds
        ss = ms / 1000
        ms = ms Mod 1000
        mm = ss / 60
        ss = ss Mod 60
        hh = mm / 60
        mm = mm Mod 60
        dd = hh / 24
        hh = hh Mod 24
        MicroSeconds.Text = ms.ToString("00")
        Seconds.Text = ss.ToString("00")
        Minutes.Text = mm.ToString("00")
        Hours.Text = hh.ToString("00")


    End Sub

Private Sub StartButton_Click(sender As Object, e As RoutedEventArgs) Handles StartButton.Click

dt.Interval = New TimeSpan(0, 0, 0, 0, 100)
AddHandler dt.Tick, AddressOf ontimertick
stopwatch.Start()
dt.Start()

End Sub

問題は、すべての変数の最初のインスタンスが、予想される実際の時間の 1/2 の時間で増加することです。

例: seconds.text は 500 ミリ秒で 1 に更新され、次は 1000 ミリ秒後に更新されます。

同様に、Minutes.text は 30 秒後に 1 に更新され、その後は通常どおり 60 秒後にインクリメントされます。

時間と日と同じですが、それ以降は最初のインスタンスのみで、通常の間隔の後に増加します

では、論理エラーを見つけるのを手伝ってくれる人はいますか?


プロセスを逆にして時間をカウントダウンするにはどうすればよいですか?

私が実装できるアイデア/ロジックを手伝ってもらえますか?

4

2 に答える 2

2

必要以上の仕事をしていると思います。このプロパティは、経過時間の個々の部分をすべて含む をStopwatch.Elapsed返します。TimeSpan

次のontimertick()ようになります。

Private Sub ontimertick()
    TimeSpan e = stopwatch.Elapsed
    MicroSeconds.Text = e.Milliseconds.ToString("00")
    Seconds.Text = e.Seconds.ToString("00")
    Minutes.Text = e.Minutes.ToString("00")
    Hours.Text = e.Hours.ToString("00")
End Sub
于 2012-09-18T18:36:39.947 に答える
2
   ss = ms / 1000

演算子は/浮動小数点除算を実行し、Double の結果を生成します。次に、それを整数に割り当てます。これにより、希望どおりに値が切り捨てられるのではなく、値が丸められます。したがって、500/1000 は 1 になります。

修正は、整数除算演算子を使用することです。

   ss = ms \ 1000

他の部門についても同様です。

于 2012-09-19T01:01:50.257 に答える