2013-08-20 3 views
0

메인 인터페이스가 표시되기 전에 메인 스레드에서 생성 된 다른 스레드 내에서 인터페이스를 표시하는 메인 스레드가 있는데, 나는 다른 창을 순차적으로 만듭니다. 첫 번째 창을 만듭니다.WTL 멀티 스레딩, 다중 인터페이스 및 라이브러리

CWarningDlg warnDlg; 
    warnDlg.Create(NULL); 
    warnDlg.ShowWindow(SW_SHOW); 
    warnDlg.BringWindowToTop(); 
    CMessageLoop _Loop ; 

    if(_MyAppModule.AddMessageLoop(&_Loop)) 
    { 
     nRet = _Loop.Run(); 
     _MyAppModule.RemoveMessageLoop(); 
    } 
    warnDlg.DestroyWindow(); 
    if (nRet == SOME_VALUE) 
    { 
     doSomethingElse(); 
    } 

다른 무언가를이 있습니다

CActionDlg actDlg; 
    actDlg.Create(NULL); 
    actDlg.ShowWindow(SW_SHOW); 
    actDlg.BringWindowToTop(); 
    CMessageLoop _Loop ; 

    if(_MyAppModule.AddMessageLoop(&_Loop)) 
    { 
     CreateAnObject(); //this also launches an object Specific Worker Thread 
     nRet = _Loop.Run(); 
     _MyAppModule.RemoveMessageLoop(); 
    } 

함수 CreateAnObject은 창조의 재미를 호출 한 스레드의 스레드 ID를 유지하는 복잡한 개체를 만들 'ComplexObject.DLL'에서 일부 함수를 호출 이 복잡한 객체를 생성하는 동안 ::GetCurrentThreadId();으로 가져옵니다. GetCurrentThreadId()는 두 번째 스레드의 ID를 반환합니다. 이것은 양호합니다. 이제 내 CActionDialog에서이 객체로부터 알림을받습니다. SendMessage(), SendMessage 함수는 방금 생성 된 복합 객체에만 해당하는 Worker 스레드에서 호출됩니다. 이러한 알림을 받으면 호출하는 스레드의 ID가 동일하다는 것을 GetCurrentThreadId() 함수를 사용하여 확인하는 'ComplexObject.DLL'의 다른 함수를 호출하기 위해 복잡한 개체 값 중 일부에 액세스해야합니다. 그 복잡한 객체를 생성 한 스레드의 ID입니다. MAIN THREAD의 스레드 ID (기본 인터페이스 GUI가 있음)를 사용하여 함수가 호출되기 때문에이 확인 작업이 실패합니다. 왜 그럴까요? 내가 이해할 수없는! (나는 성공적으로 자신을 설명하기를 희망한다).

답변

1

적어도 당신의 설명에서 볼 수있는 문제는 CreateAnObject을 통해 사용하는 외부 API가 무엇이든간에 작성 스레드에 대한 사용을 제한한다는 것입니다. 있는 그대로 받아들이는 것은 작성 스레드에서만 호출 할 수 있습니다. 스레드가 CWarningDlg 인 것을 포함한 다른 theads에서 실행중인 코드가이 API와 대화해야 할 때마다 CActionDlg 스레드로 호출을 전송하고 거기에서부터 진행해야합니다.

동기화는 이미 SendMessage이거나 이벤트/메시지 완료 알림이있는 PostMessage과 같은 더 안전한 것일 수 있습니다.

+0

하지만 CActionDialog가 두 번째 스레드에서 실행되는 것으로 충분하지 않습니까? CreateAnObject 함수에 대해 로컬이며, 외부 개체를 생성합니다. 루프를 실행하지 않고 해당 스레드에서 CActionDialog를 인스턴스화하면 해당 스레드에서 실행 중입니다. – AlexandruC

+0

'SendMessage'는 마법을 통해 호출이 창을 만든 스레드로 "전송"합니다. 이벤트가 거기에서 포인터를 직접 사용하면 다른 스레드가됩니다. 나는 이것이 당신을 혼란스럽게하는 부분이라고 생각합니다. 일단 다른 스레드로 전환하면 다시 전환 한 다음 스레드 불일치를 발생시키지 않습니다. –

+0

은 복합 객체 생성 스레드에있는 _Loop.Run() 내에서 DispatchMessage를 호출하지 않았습니까? – AlexandruC