📄 firmwareupdatestatusdlg.cpp
字号:
// ../FirmwareUpdateStatusDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RFRM.h"
//#include "../FirmwareUpdateStatusDlg.h"
#include "FirmwareUpdateStatusDlg.h"
#include "MainFrm.h"
#include "afxmt.h"
CEvent g_eventStart;
CEvent g_eventKill;
// CFirmwareUpdateStatusDlg dialog
IMPLEMENT_DYNAMIC(CFirmwareUpdateStatusDlg, CDialog)
CFirmwareUpdateStatusDlg::CFirmwareUpdateStatusDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFirmwareUpdateStatusDlg::IDD, pParent)
, m_pThread(NULL)
, m_nSecond(0)
{
}
CFirmwareUpdateStatusDlg::~CFirmwareUpdateStatusDlg()
{
}
void CFirmwareUpdateStatusDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PROGRESS1, m_progress);
}
BEGIN_MESSAGE_MAP(CFirmwareUpdateStatusDlg, CDialog)
ON_WM_NCDESTROY()
ON_MESSAGE(WM_FIRMWARE_MSG, &CFirmwareUpdateStatusDlg::OnFirmwareMessage)
ON_MESSAGE(WM_FIRMWARE_UPDATE_START, &CFirmwareUpdateStatusDlg::OnFirmwareUpdateStart)
ON_MESSAGE(WM_FIRMWARE_UPDATE_END, &CFirmwareUpdateStatusDlg::OnFirmwareUpdateEnd)
ON_WM_TIMER()
END_MESSAGE_MAP()
// CFirmwareUpdateStatusDlg message handlers
void CFirmwareUpdateStatusDlg::OnNcDestroy()
{
CDialog::OnNcDestroy();
// ::WaitForSingleObject(m_pThread, INFINITE);
delete this;
// ((CMainFrame*)GetParent())->m_pFirmwareStatusDlg = NULL;
}
BOOL CFirmwareUpdateStatusDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CRect rectFrame, rectDlg;
AfxGetMainWnd()->GetClientRect(rectFrame);
AfxGetMainWnd()->ClientToScreen(rectFrame);
GetWindowRect(rectDlg);
int nXPos = rectFrame.left + (rectFrame.Width() / 2)
- (rectDlg.Width() / 2);
int nYPos = rectFrame.top + (rectFrame.Height() / 2)
- (rectDlg.Height() / 2);
//When setting window's position, we make
//it the TOP Window. Making it the TOPMOST may
//not be such a good idea and may annoy some people!!
//The most important thing to keep in mind here
//is to specify SWP_NOCOPYBITS as the
//the window sizing and positioning flag,
//otherwise all valid contents of the client area
//of the previous window position are copied
//into the client area after the window is
//sized or repositioned.
::SetWindowPos(m_hWnd, HWND_TOP, nXPos, nYPos,
rectDlg.Width(), rectDlg.Height(),
#ifdef _WIN32_WCE
SWP_NOMOVE
#else
SWP_NOCOPYBITS
#endif
);
m_progress.SetRange(0, 100);
m_progress.SetPos(0);
// 静贰靛甫 矫累茄促.
m_pThread = AfxBeginThread((AFX_THREADPROC)ThreadProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, 0);
// if not create Thread
if( !m_pThread )
{
TRACE( TEXT("Cannot start Firmware Update thread!\n") );
return FALSE;
}
// m_pThread->m_bAutoDelete = FALSE;
m_pThread->ResumeThread();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
DWORD WINAPI CFirmwareUpdateStatusDlg::ThreadProc(LPVOID pParam)
{
int i = 0;
CFirmwareUpdateStatusDlg* dlg = (CFirmwareUpdateStatusDlg*)pParam;
//-------------------------------------------------------------
// start 捞亥飘啊 Signaled瞪 锭鳖瘤 扁促赴促.
::WaitForSingleObject(g_eventStart.m_hObject, INFINITE);
while(TRUE)
{
dlg->m_progress.SetPos(i);
Sleep(100);
i++;
if( i > 100)
i = 0;
///////////////////////
//-------------------------------------------------------------
// Kill 捞亥飘啊 汲沥登搁 风橇甫 狐廉唱埃促.
if( ::WaitForSingleObject(g_eventKill.m_hObject, 0)==WAIT_OBJECT_0)
break;
}
// ::PostMessage( dlg->GetSafeHwnd(), WM_DESTROY, 0 , 0);
dlg->DestroyWindow();
return 0L;
}
BOOL CFirmwareUpdateStatusDlg::Start()
{
// start 捞亥飘甫 汲沥(Signal) 茄促.
// 捞鉴埃何磐 困狼 worker Thread啊 角力利栏肺
// 风橇甫 倒霸等促.
return g_eventStart.SetEvent();
}
BOOL CFirmwareUpdateStatusDlg::End()
{
// Kill 捞亥飘甫 汲沥茄促.
return g_eventKill.SetEvent();
}
BOOL CFirmwareUpdateStatusDlg::GetThreadStatus()
{
// check is the thread still active
DWORD dwExitCode = 0;
GetExitCodeThread(m_pThread, &dwExitCode);
return(dwExitCode == STILL_ACTIVE);
}
LRESULT CFirmwareUpdateStatusDlg::OnFirmwareMessage(WPARAM wParam, LPARAM lParam)
{
CString strStatus((LPCTSTR)wParam), strResult((LPCTSTR) lParam);
CStatic* pStaticStatus = (CStatic*)GetDlgItem(IDC_STATIC_STATUS);
CStatic* pStaticResult = (CStatic*)GetDlgItem(IDC_STATIC_RESULT);
pStaticStatus->SetWindowText(strStatus);
pStaticResult->SetWindowText(strResult);
// Sleep(1200);
return S_OK;
}
LRESULT CFirmwareUpdateStatusDlg::OnFirmwareUpdateStart(WPARAM wParam, LPARAM lParam)
{
Start();
SetTimer(0, 1000, NULL);
return 1;
}
LRESULT CFirmwareUpdateStatusDlg::OnFirmwareUpdateEnd(WPARAM wParam, LPARAM lParam)
{
End();
KillTimer(0);
CDialog::OnOK();
return 1;
}
void CFirmwareUpdateStatusDlg::OnTimer(UINT_PTR nIDEvent)
{
CString strTimer;
switch(nIDEvent)
{
case 0:
strTimer.Format(TEXT("%u sec"), m_nSecond);
CStatic* pStaticStatus = (CStatic*)GetDlgItem(IDC_STATIC_TIMER);
m_nSecond++;
pStaticStatus->SetWindowText(strTimer);
break;
}
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -