在 MFC 對話框中,點擊按鈕切換編輯框是否動態顯示當前系統時間(格式:年-月-日 時:分:秒 星期)。再次點擊停止並清空編輯框。
bool flag 指示時間顯示線程是否運行。AfxBeginThread 創建線程,執行 time 靜態成員函數。Sleep(1000),獲取 CTime::GetCurrentTime(),格式化後用 SetWindowTextW 更新編輯框。flag,啟動或停止線程。class CMyDlg : public CDialogEx {
public:
bool flag;
static UINT time(LPVOID param);
// ...
};
CMyDlg::CMyDlg() : flag(false) {}
void CMyDlg::OnBnClickedButtonToggle() {
if (flag) {
flag = false;
// 嘗試清空編輯框(原代碼中提到可能失效)
CEdit* pEdt = (CEdit*)GetDlgItem(IDC_ShowTime);
pEdt->SetWindowText(_T(""));
} else {
flag = true;
AfxBeginThread(time, this);
}
}
UINT CMyDlg::time(LPVOID param) {
CMyDlg* dlg = (CMyDlg*)param;
CEdit* pEdt = (CEdit*)dlg->GetDlgItem(IDC_ShowTime);
CString str;
while (dlg->flag) {
Sleep(1000);
CTime t = CTime::GetCurrentTime();
str = t.Format(_T("%Y-%m-%d %H:%M:%S %A"));
pEdt->SetWindowTextW(str);
}
return 0;
}
SetWindowText(_T("")) 後又恢復。原因可能是線程仍在運行並覆蓋了內容。解決:在設置 flag=false 後,稍作延遲或使用同步機制確保線程已退出再清空。PostMessage)由主線程更新 UI。OnDestroy 中設置 flag=false 並等待。// 自定義消息
#define WM_UPDATE_TIME (WM_USER + 1)
UINT CMyDlg::time(LPVOID param) {
CMyDlg* dlg = (CMyDlg*)param;
CTime t = CTime::GetCurrentTime();
CString str = t.Format(_T("%Y-%m-%d %H:%M:%S %A"));
while (dlg->flag) {
Sleep(1000);
t = CTime::GetCurrentTime();
str = t.Format(_T("%Y-%m-%d %H:%M:%S %A"));
dlg->PostMessage(WM_UPDATE_TIME, 0, (LPARAM)(new CString(str)));
}
return 0;
}
// 主線程消息處理
LRESULT CMyDlg::OnUpdateTime(WPARAM, LPARAM lParam) {
CString* pStr = (CString*)lParam;
SetDlgItemText(IDC_ShowTime, *pStr);
delete pStr;
return 0;
}