2개의 프로젝트를 만들어 소프트웨어 업데이트 하기
1. 단일문서 기반의 첫번째 프로젝트(Update) 생성
Update.h파일에 이벤트 선언
class CUpdateApp : public CWinApp
{
public:
CUpdateApp()
CEvent m_ExitEvent;
CEvent m_UpdateEvent;
Update.cpp파일에 생성 코드 추가
CUpdateApp::CUpdateApp()
:m_ExitEvent(FALSE, TRUE), m_UpdateEvent(FALSE, TRUE, TEXT("UPDATE_SW_EVENT"))
{
// TODO: 여기에 생성 코드를 추가합니다.
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}
2. UpdateApp클래스에 함수 추가
UINT CUpdateApp::ThreadUpdate(LPVOID pParam)
{
return 0;
}
//소프트웨어 업데이트를 위한 코드 작성: 소프트웨어 업데이트에서 거의 정형화된 코드이므로 숙지. 외워도 좋음
UINT CUpdateApp::ThreadUpdate(LPVOID pParam)
{
HANDLE arhList[2];
arhList[0]=(HANDLE)theApp.m_ExitEvent;
arhList[1]=(HANDLE)theApp.m_UpdateEvent;
DWORD dwResult=::WaitForMultipleObjects(2, arhList, FALSE, INFINITE);
if (dwResult==WAIT_OBJECT_0+1)
{
CWnd* pMain=theApp.m_pMainWnd;
if (pMain != NULL) // NULL이면 윈도우가 없고, !=NULL 윈도우가 있다는 것
pMain->PostMessage(WM_CLOSE);
}
return 0;
}
3. Update.cpp에 스레드가 시작할 수 있게 해줌
AfxBeginThread(CUpdateApp::ThreadUpdate,NULL); // InitInstance()함수가 시작되면서 스레드가 돌기 시작함
4. UpdapteApp클래스에서 ExitInstance()함수 재정의
int CUpdateApp::ExitInstance()
{
m_ExitEvent.SetEvent();
::Sleep(100);
return CWinApp::ExitInstance();
}
5. 대화상자 기반의 두번째 프로젝트(SetUpdate) 생성
6. 버튼추가, 캡션 수정(Button1 -> Set UpdateEvent)
7. 버튼을 더블클릭하여 이벤트 처리기 생성
void CSetUpdateDlg::OnBnClickedButton1()
{
CEvent SetUpdateEvent(FALSE, TRUE, _T("UPDATE_SW_EVENT")); // 같은 이벤트 이름으로 설정(UPDATE_SW_EVENT)
SetUpdateEvent.SetEvent();
::Sleep(500);
}
cf.) 두 프로젝트 모두 <afxmt.h> 인클루드 해주어야 함.
<실제 소프트웨어 업데이트에서 이용>
예를 들어 익스플로러를 업데이트 할때 이미 실행되어 있는 이전 버전의 익스플로러 여러개를
업데이트 전에 한번에 다 닫아준 후 업데이트를 시작한다.
이 코드를 실행 후 업데이트를 위한 ShellExecute가 실행된다.
프로그램의 중복실행 방지
'PROGRAMMING > MFC(C++)' 카테고리의 다른 글
[0422수업] IPC통신 (0) | 2011.04.22 |
---|---|
[0422수업] 중복실행 방지 (0) | 2011.04.22 |
[0421수업] 세마포어 (0) | 2011.04.21 |
[0418수업] ThreadCrash(Critical Section, 뮤텍스) (0) | 2011.04.18 |
[본문스크랩] |소켓 프로그래밍| 멀티 스레드(스레드 동기화) ③ (0) | 2011.04.15 |