2011-01-24 4 views
-1

같은 클래스 안에 간단한 작업 스레드를 만들고 싶습니다. 클래스 헤더에 스레드 함수의MFC의 작업자 스레드

  1. 정의 그러나,이다 내가 직면하고 3 대 문제점이있다.
  2. 스레드 기능 으로 전화하십시오.
  3. 호출 된 스레드 함수 형식.

또한 AfxBeginThread 또는 CreateThread 함수 호출을 사용하여 여러 스레드 매개 변수를 전달하는 방법이 혼란 스럽습니다. 누구든지 위의 세 가지를 기반으로 MFC에서 실행되는 간단한 작업 스레드를 제공 할 수 있습니까?

+1

설명서를 읽으십시오. 문서에서 물건을 찾는 교육은 나중에 많은 시간을 절약 해줍니다. 또한 불행한 사람들이 당신을 위해해야한다고 생각할 수도있는 사람들의 시간을 절약합니다. –

+0

이것이 숙제 유형 질문 인 것 같습니다. 아마도 지금까지 해 온 것을 우리에게 보여주고 나서 조언을 구하는 것이 더 나을 것입니다. – Dave

답변

0

클래스 헤더에 스레드 함수 정의 : 숨겨진 매개 변수에 "this"를 넣는 일반적인 방법이 작동하지 않기 때문에 정적 멤버 여야합니다. 하나의 매개 변수 만 가져 오므로 매개 변수가 구조체에 대한 포인터가되고 구조체의 한 멤버가 정적 멤버가 호출 할 수있는 클래스 인스턴스의 "this"가 될 수 있습니다.

스레드 함수 호출 : 호출되는 함수가 MFC를 사용하기 때문에 호출자가 AfxBeginThread를 호출하는 것이 가장 쉽습니다. 스레드가 작업자 스레드라고 할 것이므로 worker 스레드 용으로 설계된 AfxBeginThread 버전을 호출하십시오 (많은 경우에도 중요하지 않더라도).

호출 된 스레드 함수 형식. MSDN은 AfxBeginThread를 설명하고 첫 번째 매개 변수에 어떤 프로토 타입을 사용해야하는지 설명합니다.

-1

이상적으로 CreateThred를 사용하지 않는 것이 좋습니다. 그리고 MFC를 사용한다면 AfxBeginThread를 사용하여 스레드를 생성해야합니다.

나는이 토론에서 여기에 몇 가지 설명 준 : http://www.daniweb.com/forums/thread249210.html

+0

이것은 오랜 세월 인터넷에 대한 오래된 신화입니다. CreateThread API, begin_thread CRT 또는 AfxBeginThread API를 사용하면 VS2005 이후로 더 이상 차이가 없습니다. 나는 이것과 소문 (스레드 로컬 등으로 인한 메모리 누수)에 대해 소문을 밝힐 시간을 투자했다. 항상 CreateThread를 사용하고 결코 begin_thread를 사용하지 않는 것이 좋습니다. – Lothar

+0

begin_thread와 같은 것은 없습니다. 아마도 당신은 당신의 연구에서 그 중요한 정보를 놓쳤을 것입니다. 또한 VS 2005 이후로는 왜 차이가 나지 않는 것일까 요?CRT의 단일 스레드 버전에 연결하고 CreateThread (어떤 Visual Studio 버전이 사용되는지에 관계없이)를 호출하면 API는 여전히 스레드를 생성합니다. 이는 다른 링크에서 설명한 것처럼 재앙이 될 것입니다. –

0

CreateThread는 UI 스레드를 위해 주로하지만 여전히 AfxBeginThread를위한 두 번째 방법을 사용하는 것이 바람직하다. 스레드가 아닌 헤더에 스레드 핸들에 대한 참조를 저장하십시오.

HANDLE hThread; 

다음 소스에서 proc 디렉토리를 가리키는 스레드를 시작

CWinThread *pThread; 
if(!(pThread = AfxBeginThread(ThreadProc, NULL, THREAD_PRIORITY_NORMAL, 0,  CREATE_SUSPENDED))) { 
delete arr; 
} 
::DuplicateHandle(GetCurrentProcess(), pThread->m_hThread, GetCurrentProcess(), &hThread, 0, FALSE, DUPLICATE_SAME_ACCESS); 

pThread->ResumeThread(); 

을 당신은 그렇게 당신이 헤더에 저장 한 하나의 핸들을 복사 할 수 있습니다 중지 시작합니다. 이렇게하면 저장 핸들을 사용하여 종료 코드를 확인할 수 있습니다.

관련 문제