首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

客戶端計時器暫停/繼續功能實現模式

     編輯:程式設計綜合問答

場景

辯論軟件自由辯論環節,需雙方獨立計時、隨時暫停/繼續。

核心模式

模式一:Timer 控件 + Enabled 開關(WinForm/VB6/Delphi)

// 啟動
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(遊戲/實時系統)

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;

UI 線程安全

  • WinForm: Control.Invoke / BeginInvoke
  • WPF: Dispatcher.Invoke
  • Qt: QMetaObject::invokeMethod / 信號槽
  • Web: setInterval + 狀態變量,單線程無競態

持久化建議

定期將 elapsed、paused、currentSide 存入本地存儲 (SharedPreferences/Registry/LocalStorage),防止進程意外退出丟失狀態。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved