chenluhua1980
2025-12-18 7d6d1769b7b76366fd20ab4358b8c10ce067d04f
SourceCode/Bond/Servo/CPanelProduction.cpp
@@ -1,4 +1,4 @@
// CPanelProduction.cpp
// CPanelProduction.cpp
//
#include "stdafx.h"
@@ -20,6 +20,8 @@
   m_hbrBkgnd = nullptr;
   m_nPanelWidth = 288;
   m_hPlaceholder = nullptr;
   m_bShiftSummaryValid = FALSE;
   m_pStatsThread = nullptr;
}
CPanelProduction::~CPanelProduction()
@@ -38,6 +40,7 @@
   ON_WM_SIZE()
   ON_NOTIFY(BYVERTICALLINE_MOVEX, IDC_LINE1, &CPanelProduction::OnVLineMoveX)
   ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CPanelProduction::OnBnClickedButtonClose)
   ON_WM_TIMER()
END_MESSAGE_MAP()
int CPanelProduction::getPanelWidth()
@@ -58,6 +61,9 @@
   pLine1->SetBkgndColor(RGB(225, 225, 225));
   pLine1->SetLineColor(RGB(198, 198, 198));
   pLine1->EnableResize();
   SetTimer(1, 1000 * 10, nullptr);
   StartStatsThread();
   return TRUE;  // return TRUE unless you set the focus to a control
              // Exception: OCX property pages should return FALSE
@@ -81,6 +87,8 @@
void CPanelProduction::OnDestroy()
{
   StopStatsThread();
   CDialogEx::OnDestroy();
   if (m_hbrBkgnd != nullptr) {
@@ -123,3 +131,68 @@
      pParent->PostMessage(WM_COMMAND, ID_MENU_WND_TEST_PANEL, 0);
   }
}
BOOL CPanelProduction::TryGetShiftSummary(ProductionShiftSummary& outSummary)
{
   CSingleLock lock(&m_csShiftSummary, TRUE);
   if (!m_bShiftSummaryValid) return FALSE;
   outSummary = m_shiftSummary;
   return TRUE;
}
void CPanelProduction::StartStatsThread()
{
   if (m_pStatsThread != nullptr) return;
   m_evStopStats.ResetEvent();
   m_pStatsThread = AfxBeginThread(&CPanelProduction::StatsThreadProc, this, THREAD_PRIORITY_BELOW_NORMAL, 0, 0);
   if (m_pStatsThread != nullptr) {
      m_pStatsThread->m_bAutoDelete = FALSE;
   }
}
void CPanelProduction::StopStatsThread()
{
   if (m_pStatsThread == nullptr) return;
   m_evStopStats.SetEvent();
   const DWORD rc = WaitForSingleObject(m_pStatsThread->m_hThread, 5000);
   if (rc == WAIT_OBJECT_0) {
      delete m_pStatsThread;
   }
   m_pStatsThread = nullptr;
}
UINT CPanelProduction::StatsThreadProc(LPVOID pParam)
{
   CPanelProduction* self = reinterpret_cast<CPanelProduction*>(pParam);
   if (self == nullptr) return 0;
   const DWORD intervalMs = 5000;
   for (;;) {
      if (self->m_evStopStats.Lock(intervalMs)) break;
      ProductionShiftSummary summary;
      if (ProductionStats::ComputeCurrentShiftSummary(theApp.m_model.m_configuration, summary)) {
         CSingleLock lock(&self->m_csShiftSummary, TRUE);
         self->m_shiftSummary = std::move(summary);
         self->m_bShiftSummaryValid = TRUE;
      }
   }
   return 0;
}
void CPanelProduction::OnTimer(UINT_PTR nIDEvent)
{
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   if (nIDEvent == 1) {
      ProductionShiftSummary outSummary;
      if (TryGetShiftSummary(outSummary)) {
         TRACE("OnTimer outSummary.output.pairsPass:%d\n", outSummary.output.pairsPass);
      }
   }
   CDialogEx::OnTimer(nIDEvent);
}