티스토리 툴바


Sleep()함수를 일정시간 이상 사용하다 보면 Sleep 하는 동안 프로그램이 CPU를 사용하지 않기 때문에 그 프로그램이 응답없음으로 나오는 경우가 있다. 만약 1초에 Progress바를 한칸씩 생성한다고 할 경우에 프로그램이 응답없음이 되어버리면 중간에 Progress바가 멈춰있다가 Sleep함수에서 설정한 시간이 다 된후에 갑자기 완료가 된다.

 

그럼 이 문제를 어떻게 해결해야 할까???

 

먼저 제일 처음 쓰레드와 동기화를 생각해 볼수 있다.

쓰레드로 일정시간 돌리는 동안 메인 쓰레드는 WaitForSingleObject()함수로 기다리게 한다고 가정해보자.

이럴 경우에 메인 쓰레드는 효율적 사용을 위해서 다른 쓰레드에게 CPU 사용권을 넘겨준다. 결국 Sleep과 똑같은 상태로 일정 시간이 지날 경우에는 응답없음이 뜰수 밖에 없다.

 

그렇다면 응답없음이 나오지 않게 즉, CPU를 계속 점유하고 있을 방법은 뭐가 있을까?

 

 

void Delay_Wait(DWORD dwMillisecond)
{
  MSG msg;
  DWORD dwStart;

  dwStart = GetTickCount();


 

 while(GetTickCount() - dwStart < dwMillisecond) 
 {
  while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 } 

 

위와 같은 함수를 만든후 Sleep 함수를 사용한것과 같이 사용할 경우에 응답없음을 해결할수 있다.

 

 위의 함수의 로직을 보게 되면 GetTickCount로 시간을 세서 그 시간 전까지 메세지 루프를 돌다가 설정한 시간보다 같거나 클 경우 while 구문을 빠져나오게 된다.

 

PeekMessage는 WinMain에서 자주쓰이는 GetMessage와는 달리 (GetMessage는 메세지가 들어올때까지 기다린다.) 메세지 큐에 메세지가 있는지 없는지 확인 후 바로 리턴한다. 그걸 while로 계속 해서 메세지 큐를 검사하기 때문에 시간을 기다리는 동안에도 CPU를 계속해서 사용할 수 밖에 없다. 그러므로 응답없음에 빠지지 않고 프로그램은 정상적으로 실행되게 된다.

 

 추가로 위에서 사용한 PeekMessage 에서 PM_REMOVE인자는 메세지 큐에서 메세지를 가지고 오고나서 메세지 큐에서 메세지를 제거해 준다는 뜻으로 사용한 메세지는 사용후 메세지 큐에서 제거해 주는게 바람직 하다.

PeekMessage의 자세한 사항은 http://msdn.microsoft.com/ko-kr/library/ms911928(en-us).aspx 여기서 확인하기 바란다.

 

 

참조문헌: http://lafirr.tistory.com/56

저작자 표시

'Computer > Windows Programming' 카테고리의 다른 글

Sleep함수 대신 사용할수 있는 함수 만들기  (0) 2012/04/22
Posted by Dr_bug

파일 우클릭시 탭에 추가하기 위해서는  HKEY_CLASSES_ROOT를 손대야 한다.
(HKEY_CLASSES_ROOT에 관해서는 http://whdudgn.tistory.com/29 를 참고 하도록 한다.)

탭에 관련된 사항은 모두 shell이나 shellex에서 일어난다.

둘다 같은 기능을 하나 차이점은 shell은 실행파일을 실행하는 반면에 shellex는 shell의 확장판으로써 dll파일을 실행할수 있다는 점이다.(shellex는 CLSID를 사용한다.)

File이나 Folder 윈도우 바탕화면 탭도 다 같은 원리이나 다루는 레지스트리가 다르기 때문에 한번 봐두도록 하자.


※파일이던 폴더던 바탕화면이던 공통사항

지정한 레지스트리에 Key를 생성하고 (기본값)에 우리가 사용할 이름을 쓰면 파일 오른쪽 클릭후 탭에는 (기본값)에 들어간 내용이 탭에 뜬다.

그리고 우리가 생성한 키를 클릭시 생성키 하위에 있는 command의 값에 써져있는 명령어가 작동하게 된다.

그리고 생성항목을 숨기고자 한다면 Extended 값을 하나 더 만들고, 삭제 하지 않고 무효화를 하기 위해서는 LegacyDisable 값을 생성한다.


①File

먼저 File에 탭을 추가하는 법부터 알아보자.

File에 탭을 추가하기 위해서는

[HKCR\<ProgID>\shellex\ContextMenuHandlers\] //그 프로그램에만 적용
[HKCR \*\shellex\ContextMenuHandlers\] //모든 파일에 적용(dll)
[HKCR\*\shell\] //모든 파일에 적용 (실행파일)

이중 하나의 레지스트리에 키를 추가해야 한다.

예를 들어 [HKCR\*\shell\]에 키를 추가해서 탭을 만든다고 생각해 보자.

[그림1] HKCR\*\shell에 NewKey 생성




[그림2] 파일 탭 생성 결과



②Folder에만 적용

Folder에만 적용되는 레지스트리는

[HKCR\Folder\Shell\]
[HKCR\Folder\ShellEx\ContextMenuHandlers\]
[HKCR\Directory\Shell\]
[HKCR\Directory\ShellEx\ContextMenuHandlers\]

이와 같이 4가지가 있다.

여기서는 [HKCR\Folder\Shell\] 을 이용해서 만들어 보겠다.


[그림3] HKCR\Folder\Shell을 이용해 탭 생성



[그림4] 폴더 탭 생성 결과

③파일&폴더에 전부 적용

[HKCR\AllFilesystemObjects\shell\]
[HKCR\AllFilesystemObjects\shellex\ContextMenuHandlers\]

결과는 위와 같으므로 캡쳐는 하지 않겠다.
//휴지통이나 내컴퓨터 이런데는 적용되지 않는다. 이런곳은 따로 응용프로그램 식별자에 해 주어야 한다.


③윈도우 바탕화면

[HKCR\Directory\Background\Shell\]
[HKCR\Directory\Background\\shellex\ContextMenuHandlers\]

 

[그림5] 윈도우 바탕화면 탭 생성


[그림6] 바탕화면 탭

 




참고로 위와같은 레지스트리 손대는것이 귀찮은 경우도 있을것이다.

그런 경우에는 수정을 좀 더 간편하게 해 줄 Nirsoft사의 ShellMenuView와 ShellExView 프로그램이 있다.

[그림7] ShellMenuView



[그림8] ShellExView








※참고문헌
저작자 표시

'Computer > Computer Sence' 카테고리의 다른 글

파일&폴더 우클릭시 생성 탭 추가  (0) 2012/01/03
Registry - HKEY_CLASSES_ROOT 분석  (0) 2012/01/03
추상(abstraction)이란???  (0) 2010/03/08
Posted by Dr_bug
Ⅰ HKEY_CLASSES_ROOT 키의 역할

- 윈도우에서 사용하는 각 프로그램과 파일 확장명 연결에 대한 정보 단축 정보 저장.
- 윈도우의 OLE(OBject Linking and Embedding)와 관련된 내용 저장



Ⅱ. HKEY_CLASSES_ROOT의 특징

- HKEY_CLASSES_ROOT는 HKEY_LOCAL_MACHINE->SOFTWARE->CLASSES 와 동일
- 키의 (기본값) 에는 해당 파일 확장명이 연결된 프로그램이 저장되어 있다.




Ⅲ. HKEY_CLASSES_ROOT 분석

레지스트리의 제일 위부분 HKEY_CLASSES_ROOT는 크게보면 세부분으로 나누어져 있다.

'*', '확장명', '응용 프로그램 식별자'

① HKEY_CLASSES_ROOT -> '*'
기본적인 파일에 관한 빠른메뉴(파일 우클릭후 탭).//폴더는 제외

② HKEY_CLASSES_ROOT -> '확장명'
윈도우에서 사용하는 파일 확장명이 어떤 프로그램에 연결되어 있는지에 관한 정보가 들어있다.
ex) '확장명' = .exe .hwp등등
      Content Type, Perceived Type - 확장명을 가진 파일의 성격

③ HKEY_CLASSES_ROOT -> '응용 프로그램 식별자'
응용 프로그램 식별자가 이름인 키에는 윈도우가 해당 파일을 어떻게 처리하는지에 대한 정보가 들어있다.
ex) 아이콘 모양, 인쇄명령등등

아래의 그림은 Acrobat Reader의 Registry의 응용프로그램 식별자(AcroExch.Document.7)인데 DefaultIcon을 통해 아이콘을 알수 있고  shell 밑에 Print명령이 있는것을 통해서 어떻게 인쇄하는지도 알게 된다.
세부적인것은 밑에서 다시 설명하겠다.


[그림1]Acrobat Reader의 Registry



이제 전체적인 틀을 알았으면 그 하위에 있는 세부적인 정보에 대해서 알아보자.


●CLSID
-파일 형식과 관련된 특별한 OLE(OBject Linking and Embedding)개체 형식에 대해 포괄적이면서도 고유한 클래스ID이다. 
일반적으로 확장명, 응용프로그램 식별자 하위에 CLSID가 있고 그 부분에 정의되어 있는게 대부분인데 그냥 정의 되어 있는 곳도 있다.
예를들어 레지스트리에 {6FDEDD65-AC51-43CA-B2D0-9EB5D1155D03} 한 문자열을 볼 경우 CLSID라고 생각하면 된다.
그리고
    HKEY_CLASSES_ROOT -> CLSID 에 가면
내가 보았던 같은 CLSID를 발견할 수 있고 그 키를 들여다 보면 더 자세한 정보를 알 수 있다.

[그림2] HKEY_CLASSES_ROOT\CLSID



●DefaultIcon
- 아이콘과 연결된 프로그램의 경로와 실행파일 이름이 등록되어 있다.

[그림3] HKEY_CLASSES_ROOT\AcroExch.Document.7\DefaultIcon



●protocol
-각 개체가 지원하는 OLE 명령어 (열거, 내부활성화, 비활성화 등)를 지원하기 위한 정보가 저장 되어 있다.

●Insertable
- 이 키가 있다면 특별한 형식의 OLE 개체가 다른 OLE 문서 형식에 삽입되고 내잘될수 있다는걸 의미 한다. 예를들어 그림판에 있는 그림을 복사해서 한글파일에 붙여넣을수 있는 것도 이 키가 존재하기에 가능한 것이다.

●shell
- 파일의 빠른메뉴늘 열었을 경우, 특정 파일에만 원하는 탭이 나타나게 설정이 가능하다. 그러나 shell은 .exe의 종류의 실행파일이 등록 가능한다.

●shellex
- shell과 마찬가지의 기능을 담당하지만 .dll파일의 등록이 가능하다. shell의 확장판이라고 보면된다.
그리고 shellex는 CLSID를 이용한다.

 


참고문헌
- http://blog.naver.com/sfect86?Redirect=Log&logNo=60033467093 ==> HKEY_CLASSES_ROOT
저작자 표시

'Computer > Computer Sence' 카테고리의 다른 글

파일&폴더 우클릭시 생성 탭 추가  (0) 2012/01/03
Registry - HKEY_CLASSES_ROOT 분석  (0) 2012/01/03
추상(abstraction)이란???  (0) 2010/03/08
Posted by Dr_bug
이전버튼 1 2 3 4 5 ... 10 이전버튼