// 定义一个消息常量用于异步更新界面
#define WM_UPDATE_LOG (WM_USER + 1)
// 显示日志
void CDlgStepControl::LogMessage(const CString& message)
{
// 获取当前线程 ID
DWORD threadId = GetCurrentThreadId();
// 获取当前本地时间
SYSTEMTIME timeCur;
GetLocalTime(&timeCur);
// 格式化时间和线程 ID
char t_logbuffer[1024] = { 0 };
sprintf_s(t_logbuffer, "[%04d-%02d-%02d %02d:%02d:%02d:%03d][线程ID%d]",
timeCur.wYear, timeCur.wMonth, timeCur.wDay,
timeCur.wHour, timeCur.wMinute, timeCur.wSecond, timeCur.wMilliseconds, threadId);
// 拼接完整的日志消息
CString fullMessage;
fullMessage.Format(_T("%s %s\r\n"), CString(t_logbuffer), message);
// 加锁,仅在操作共享资源时加锁
EnterCriticalSection(&m_csLog);
m_strLog += fullMessage;
// 检查日志行数是否达到上限
int nline = m_strLog.GetLength() - m_strLog.Replace(_T("\r\n"), _T(""));
if (nline >= 100)
{
m_strLog = "";
}
// 异步更新界面
PostMessage(WM_UPDATE_LOG);
// 如果启用日志记录,将日志消息放入队列等待写入文件
if (pMain->m_NodeInfo.m_bEnableLog)
{
// 这里可以使用一个队列来存储日志消息,由工作线程处理
// 例如:m_logQueue.push(fullMessage);
}
LeaveCriticalSection(&m_csLog);
}
// 处理异步更新界面的消息
LRESULT CDlgStepControl::OnUpdateLog(WPARAM wParam, LPARAM lParam)
{
// 更新界面上的日志显示
m_editLog.SetWindowText(m_strLog);
int nline = m_editLog.GetLineCount();
m_editLog.LineScroll(nline - 1);
return 0;
}
// 工作线程函数,用于异步写入日志文件
DWORD WINAPI LogWriteThread(LPVOID lpParam)
{
CDlgStepControl* pDlg = (CDlgStepControl*)lpParam;
while (true)
{
// 检查队列中是否有日志消息
// 如果有,取出消息并写入文件
// 例如:
// if (!pDlg->m_logQueue.empty())
// {
// CString message = pDlg->m_logQueue.front();
// pDlg->m_logQueue.pop();
// pDlg->writelog(pDlg->m_strfilename, message);
// }
// Sleep(100); // 适当休眠,减少 CPU 占用
}
return 0;
}
02-13
6221

09-14
797
