辯論軟件自由辯論環節,需雙方獨立計時、隨時暫停/繼續。
// 啟動
timer1.Interval = 1000; // 1秒
timer1.Enabled = true;
// 暫停
timer1.Enabled = false;
// 繼續
timer1.Enabled = true;
// Tick 事件
void timer1_Tick() {
if (currentSide == Side.A) timeA++;
else timeB++;
UpdateUI();
}
volatile bool running = true;
volatile bool paused = false;
int elapsed = 0;
Task.Run(() => {
while (running) {
if (!paused) {
Thread.Sleep(1000);
Interlocked.Increment(ref elapsed);
UIInvoke(UpdateUI);
} else {
Thread.Sleep(100); // 減少 CPU 佔用
}
}
});
// 暫停/繼續
pauseBtn.Click += (s,e) => paused = !paused;
Stopwatch sw = Stopwatch.StartNew();
TimeSpan pausedTotal = TimeSpan.Zero;
DateTime pauseStart;
void Pause() {
if (sw.IsRunning) {
sw.Stop();
pauseStart = DateTime.Now;
}
}
void Resume() {
if (!sw.IsRunning) {
pausedTotal += DateTime.Now - pauseStart;
sw.Start();
}
}
TimeSpan CurrentElapsed => sw.Elapsed + pausedTotal;
Control.Invoke / BeginInvokeDispatcher.InvokeQMetaObject::invokeMethod / 信號槽setInterval + 狀態變量,單線程無競態定期將 elapsed、paused、currentSide 存入本地存儲 (SharedPreferences/Registry/LocalStorage),防止進程意外退出丟失狀態。