| | |
| | | // CPanelProduction.cpp |
| | | // CPanelProduction.cpp |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | |
| | | m_hbrBkgnd = nullptr; |
| | | m_nPanelWidth = 288; |
| | | m_hPlaceholder = nullptr; |
| | | m_bShiftSummaryValid = FALSE; |
| | | m_pStatsThread = nullptr; |
| | | } |
| | | |
| | | CPanelProduction::~CPanelProduction() |
| | |
| | | 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() |
| | |
| | | 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 |
| | |
| | | |
| | | void CPanelProduction::OnDestroy() |
| | | { |
| | | StopStatsThread(); |
| | | |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | |
| | | 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); |
| | | } |