외규장각 도서 환수 모금 캠페인

Search Results for '분류 전체보기'

279 POSTS

  1. 2007.06.01 Thread 해결 ^____________________^ 2
  2. 2007.06.01 쓰레드 ㅠ_ㅡ 2
  3. 2007.06.01 하지 말아야 할 것 2
  4. 2007.06.01 해커스 게시판들.. 1
  5. 2007.05.31 수영 - 자유형 물젓기

Thread 해결 ^____________________^

Posted 2007. 6. 1. 13:08, Filed under: Study/Computer Science

어제부터 고민하던 문제 완죤 해결 ㅋㅋㅋ

OK 버튼 눌렀을 때 실행하는 모든 프로시저를 스레드로 만들면 순차실행하는 데 아무런 문제 없음
전에 이런 방식으로 할려다가 Dialog Item 들을 마음대로 사용할 수 없어서 포기했는데 (5번 문제점)

CWnd를 상속한 클래스에서 멤버 함수로 핸들을 가지고 있으니까 이걸 써두 되고..
The m_hWnd data member is a public variable of type HWND

윈도우를 통째로 스레드 프로시저의 파라미터로 넘겨서 캐스팅하면 OnOK 함수 내에서 처럼 사용 가능하다는 것 ^^ .. 다른 맴버 변수에 직접 접근할 수 있기 때문에 이 방법이 더 깔끔하다.

스레드 첨 써봐서 진짜 힘들었는데.. 그럭저럭 인제 어째 되는지는 알겠다.
이번 경우는 스레드간 통신도 없고 동기화도 안해도 되는 별로 어렵지 않은.. 단지 스레드였지만
다음에는 더 어려운거에 도전해봐야지 ㅋㄷ

UINT threadCnt(LPVOID DlgHpcnt)
{
 // create class instances
 CHpCntDlg* Cntdlg = (CHpCntDlg*)DlgHpcnt;   // 이렇게 캐스팅해서 맘껏 사용 ㅋㄷ
 HpCounter* hpc = new HpCounter(Cntdlg);
 
 // disable button
 Cntdlg->GetDlgItem(IDOK)->EnableWindow(false);

 // Homepage upload count
 hpc->MakeTmp();   // make temporary folder
 Cntdlg->GetDlgItem(IDC_STEP)->SetWindowText("홈페이지 업로드 카운트 중...");

 if(Cntdlg->m_CheckINI ==TRUE) {
  hpc->WriteINICnt();
 }

 // Sample Count
 Cntdlg->GetDlgItem(IDC_STEP)->SetWindowText("엔진 샘플 수 카운트 중...");
 SpCounter* spc = new SpCounter(Cntdlg);
 for(int i = 0; i < 7; i++)
 {
  spc->TotalSample();
  spc->ECSample();
  spc->MoveDate();
 }
 
 CTimeSpan day = CTimeSpan(1,0,0,0);
 CTime Date = CTime::GetCurrentTime() - day;

 CString szBuffer = _T("");
 char szBuf[80] = _T("");


 
 // Print Result
 Cntdlg->m_Result.DeleteAllItems();
 Cntdlg->GetDlgItem(IDC_STEP)->SetWindowText("결과 출력");
 for (i = 0; i < 7; i++){
  szBuffer.Format("%8d.%02d.%2d", Date.GetYear(), Date.GetMonth(), Date.GetDay());
  Cntdlg->m_Result.InsertItem(LVIF_TEXT, 0, szBuffer, 0, 0, 0, 0);
 
   itoa((spc->arResult[6-i]).nTotalSample, szBuf, 10);
   Cntdlg->m_Result.SetItemText(0, 1, szBuf);

   
   itoa((spc->arResult[6-i]).nECSample, szBuf, 10);
   Cntdlg->m_Result.SetItemText(0, 2, szBuf);

   
   
   itoa((hpc->arResult[6-i]).nKorCnt, szBuf, 10);
   Cntdlg->m_Result.SetItemText(0, 3, szBuf);
   
   itoa((hpc->arResult[6-i]).nEngCnt, szBuf, 10);
   Cntdlg->m_Result.SetItemText(0, 4, szBuf);
   
  Date -= day;

 }
 //enable Run button
 Cntdlg->GetDlgItem(IDOK)->EnableWindow(true);
 
 return 0;
}

Response : ,

쓰레드 ㅠ_ㅡ

Posted 2007. 6. 1. 11:58, Filed under: Study/Computer Science

void CHpCntDlg::OnOK() {
 
UpdateData(TRUE);
HpCounter* hpc = new HpCounter(dlg);
 
 // Homepage upload count
 hpc->MakeTmp();   // make temporary folder
 GetDlgItem(hWnd ,IDC_STEP)->SetWindowText("홈페이지 업로드 카운트 중...");

 pHpthread = AfxBeginThread(threadHompageCnt, hpc);

 if( m_CheckINI == TRUE){
  hpc->WriteINICnt();
 }

 // Sample Count
 GetDlgItem(IDC_STEP)->SetWindowText("엔진 샘플 수 카운트 중...");
 SpCounter* spc = new SpCounter(this);
 pSptread = AfxBeginThread(threadSampleCnt, spc);
 pSptread->SuspendThread();

...

}

------

1. Ok 버튼을 눌렀을 때 수행되는 위의 프로시져가 웹페이지를 다운로드해서 파싱하고 결과를
   출력하는 시간이 꽤 걸리는 작업이라서 창을 다시 그려줄  때 깨지거나 응답없음이 나타난다.

2. 쓰레드를 이용해서 내부 프로시져가 돌아가는 거랑 창을 그려주는 걸 별도로 수행하도록 하면
    해결할 수 있음.

3. 쓰레드를 생성하기 위해서는 UINT 함수이름(LPVOID pParam); 와 같은 형식의 쓰레드에서
   실행하는 처리를 당담하는 프로시저가 필요함
   (형식의 제한이 있어서 복잡한 파라미터를 넘겨주는 함수를 구현할 수가 없었다.
    이럴 때는 파라미터를 모두 가지는 구조체를 선언하여 그 포인터를 넘기면 된다고 한다.)

4.  쓰레드를 생성할 때는 CreateThread 윈도우 API 보다는 AfxBeginThread를 사용하는 것이 바람직
C/C++의 표준 라이브러리를 사용하는 경우 프로세스 내의 스레드는 메모리 공간을 공유하기 때문에 정적 변수 사용등에 있어서 문제가 발생한다. (예: strtok) 이를 방지하기 위해서 윈도우에서 쓰레드마다 다른 메모리 영역을 정적으로 할당(TLS: Thread Local Storage) 이 때 TLS를 사용하기 위해서는 쓰레드를 생성할 때 초기화 등의 준비가 필요한데 CreateThread를 사용해 쓰레드를 생성하면 이런 처리를 할 수 없다.

5. 쓰레드 함수 내에서는 GetDlgItem() 함수를 호출할 수 없음. (쓰레드 함수는 전역으로 선언되어있고 윈도우(다이얼로그) 내부의 함수가 아니므로) 그리하여 GetDlgItem 부분은 OnOK() 함수에서 처리하고 나머지를 둘로 나누어 각각 쓰레드로 처리하려고 했는데.. 그렇게 했더니 파일 I/O 가 있는 부분에서 대기하는 동안 제어가 다른 쓰레드로 넘어가면서 병렬로 처리되고 결과가 제대로 안나온다. 순차적으로 처리해야하는 프로시저에서 분리를 목적으로 쓰레드를 사용하니까 참 맘대로 안된다.

6. 그래서 WaitForSingleObject() 를 사용해서 쓰레드 처리를 기다리려고 했는데. AfxBeginThread 함수나 CreateThread 함수는 쓰레드 생성에 성공하면 쓰레드 프로시저의 종료를 기다리지 않고 즉시 호출로부터 복귀한다. 그래서 WaitForSingleObject 가 별로 소용이 없다. 게다가 메인 프로시저는 쓰레드 프로시저의 상태와 상관없이 계속해서 프로그램을 실행하므로 출력루틴이 먼저 실행되는 사태가 발생해서 완전 결과가 엉망이 됐다.

7. 윈도우 자체를 쓰레드 프로시저에 넘겨주고 GetDlgItem를 호출할 수 있도록 만들려고 했는데 윈도우 핸들을 얻어오는게 맘처럼 쉽지가 않다 ;;

8. 쓰레드 핸들을 사용해서 한번 컨트롤 해봐야겠다..

쓰레드 너무 힘들다 ㅠ_ㅠ

Response : ,

하지 말아야 할 것

Posted 2007. 6. 1. 11:29, Filed under: Story
아침에 지하철에서 무료 신문 찌라시 기사 보지 말기.

인터넷 게시판, 포탈 뉴스들 보지 말기.

하루에 위닝 2게임 이상 안하기. ㅋ

절대적 시간 낭비!
Response : ,

해커스 게시판들..

Posted 2007. 6. 1. 11:24, Filed under: Story

해커스 예전부터 무료강의 - LC, RC 때문에 매일 한번씩은 들어가는 사이트인데..

가끔 심심해서 들어가보는 취업 게시판 이런데는 완전 쓰레기..

취업 게시판 이런데는 전부 지 자랑아니면 학벌, 토익 가지고 다른 사람 까대는 애들 뿐이고..
혹은 그저 자기 위안을 위해서 한번 확인해보는 사람들.

대부분의 사람들 마인드가 토익이랑 학벌, 학점이면 된다는 식이라서 진짜 역겹다.
그깟거 뭐 대단한 거라고.. 가끔 이렇게 이야기 하는 사람 있으면

너 토익 성적도 안나오고 영어도 못하는 지방대 찌질이지 이런 식이고
성적도 높고 공부도 열심히 하고 자격증도 있다. 그럼 지방대라 안된다 그러고
학교도 명문이다. 결국 지 자랑이네. 이런식이다..

정말.. 뭐하는 사람들인지.. 참 씁쓸하다 ㅋ

Response : ,

수영 - 자유형 물젓기

Posted 2007. 5. 31. 22:22, Filed under: Study/Swim

자유형 물젓기

6-Q13. 자유형 물젓기는 어떻게 하나요?


A. 처음 수영을 배울 때는 팔을 일자로 편 채 물젓기를 하다가 차츰 실력이 좋아지고 중,상급수준이 되면 물잡기를 배우게 되는데, 초,중급자들은 아직 팔젓기가 미숙하여 거의 대부분 팔꿈치가 떨어진 상태에서 물을 끌어당겨 앞으로 나가려 하지요. 이런식의 수영은 물잡기가 거의 없는 상태이고 손바닥으로 물을 누르는 형태라 많은 추진력을 얻을 수 없답니다. 그래서 물젓기를 배워야 한답니다.


물의 밀도는 공기보다 수백배 높습니다. 단순한 힘으로서 수영을 한다면 나의 모든 에너지를 물에 빼앗겨 금방지치게 합니다. 그러므로 수영은 테니스나 스키를 배우는 것과 같이 힘으로가 아닌 기술적인 동작을 익히는 것입니다.


물젓기는 달리는 차창에 손을 내밀며 앞뒤로 움직여보면, 공기가 손에 부딪쳐 압력을 느끼게 될 것입니다. 마치 그런 느낌을 물 속에서 받을 수 있답니다. 물젓기는 1자 스트록과 S자 스트록의 두가지 형태가 있지만, 1자의 직선패턴으로 물잡기를 하는 것은 강한 어깨와 추진력 높은 발차기의 기술이 필요한 만큼, 일반인들의 경우에는 S자의 곡선 형태로 물젓기를 많이 하게됩니다.


물잡기는 마치 “큰 술통을 넘어 뻗어서 누르라”로 표현하는데 이는 자유형 스트로크에서 손을 앞으로 뻗는 단계에서 바로 이어지는 스트로크 단계인 물잡기(catching)동작을 표현한 말입니다.


그림 [6-Q13-A]- 1자 스트록 , S자 스트록

http://www.swimlover.com/Lecture/freestyle.html 그림참조




풀동작의 순서는 다음과 같습니다.

입수(Entry) → 뻗기(Stretch) → 휘감기(Catch) → 아래로 젓기(Downsweep) → 안으로 젓기(Insweep) →위로 젓기(Upsweep) → 되돌리기(Recovery) 

이런 순으로 한스트록이 이루어집니다.


입수(Entry) : 입수는 머리와 어깨의 연장선 사이인 전방에서 이루어지며 엄지와 검지손가락을 제일먼저 입수를 하고, 손바닥은 30°~45° 바깥쪽을 향하게 하여 입수를 합니다. 사진 [6-Q13-C]입수자세


▶  뻗기(Stretch) : 입수를 하고 난 다음 수면 바로 밑에서 어깨를 밀어 뻗어주기를 하는데 이러한 것을 글라이드(Glide)라고 합니다. 글라이드시 초보자들은 아래사진과 같이 손보다 팔꿈치와 어깨가 떨어지는데 이러한 점을 주의 해야 한답니다. 뻗기 동작은 장거리시와 단거리시에 차이가 있을 수 있는데 아래의 그림을 보며 이해를 하시기 바랍니다.


사진 [6-Q13-D]뻗기자세

http://www.swimlover.com/Lecture/freestyle.html 에서 뻗기 자세인 2개의 애니메이션 참조


휘감기(Catch) : 뻗어준 다음 아래로 젓기전에 사진과 같이 손목을 약간 구부려 물을 잡는 듯한 느낌을 받습니다. 사진 [6-Q13-E]휘감기자세


아래로젓기(Downsweep) : 일부러 바깥쪽으로 돌리려 하지 않아도 어깨를 돌려 팔동작을 하면 자연히 바깥쪽, 아래쪽 방향으로 물의 압력을 느끼며 서서히 떨어집니다. 아래로 젓기도 마찬가지로 팔꿈치와 어깨가 먼저 밑으로 떨어지지 않게 주의 합니다. 사진 [6-Q13-F1, F2]아래로젓기 자세


안으로 젓기(Insweep) : 아래로 젓기시의 가장 밑에서부터 시작하여 “?” 형태의 둥근모양이 되게 어깨의 바깥쪽으로 돌려 몸의 안쪽, 위쪽을 향해 팔꿈치를 세워 가슴의 명치부위 밑에까지 긁어옵니다. 사진 [6-Q13-G1, G2]안으로젓기 자세


위로 젓기(Upsweep) : 가슴까지 긁어온 물은 허벅지 방향을 향해 바깥쪽, 뒤쪽, 위쪽 방향으로 힘을 주어 푸쉬를 합니다. 손이 허벅지에 닿을 정도부터 수압의 힘을 떨어뜨리고, 손바닥을 안쪽을 향하게 하여 되돌리기를 할 준비를 합니다.

사진 [6-Q13-H]위로젓기 자세


되돌리기(Recovery) : 전방에서 받을 때 출수시 손의 엄지와 검지가 보이게 하 며 팔꿈치의 무게중심을 실어 어깨의 연장선까지 팔꿈치를 높게 들어줍니다, 손은 팔꿈치보다 낮게 위치하며 손의 각은 전방에서 받을 때 손등이 보이게 하고 어깨의 연장선이 지나면 무게 중심이 손으로 전달되어 머리와 어깨의 연장선 전방에 엄지와 검지순으로 입수를 합니다. 입수시에는 팔꿈치와 어깨가 먼저 떨어지지 않게 하고 어깨가 귀를 스치는듯한 느낌으로 입수를 합니다.

사진 [6-Q13-I] 되돌리기 자세


< 상기 정보는 스윔닥터의 동의없이 무단으로 재배포할 수 없습니다. >

-----------

복근에 힘을 써 헤엄치면, 몸이 똑바로 되어 저항이 경감되다라고 생각합니다. 자세가 좋게 된다라고 말하는 것은, 요통 예방에도 도움이 된다고 생각하므로 모든 수영에 필요한 일이 아닐까 하고 생각하고 있습니다.

Response : ,

« Previous : 1 : ··· : 39 : 40 : 41 : 42 : 43 : 44 : 45 : ··· : 56 : Next »

Recent Posts

Recent Comments

Recent Trackbacks

Total hit (Today , Yesterday )

Admin Write Post