메인 인터페이스가 표시되기 전에 메인 스레드에서 생성 된 다른 스레드 내에서 인터페이스를 표시하는 메인 스레드가 있는데, 나는 다른 창을 순차적으로 만듭니다. 첫 번째 창을 만듭니다.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가 있음)를 사용하여 함수가 호출되기 때문에이 확인 작업이 실패합니다. 왜 그럴까요? 내가 이해할 수없는! (나는 성공적으로 자신을 설명하기를 희망한다).
하지만 CActionDialog가 두 번째 스레드에서 실행되는 것으로 충분하지 않습니까? CreateAnObject 함수에 대해 로컬이며, 외부 개체를 생성합니다. 루프를 실행하지 않고 해당 스레드에서 CActionDialog를 인스턴스화하면 해당 스레드에서 실행 중입니다. – AlexandruC
'SendMessage'는 마법을 통해 호출이 창을 만든 스레드로 "전송"합니다. 이벤트가 거기에서 포인터를 직접 사용하면 다른 스레드가됩니다. 나는 이것이 당신을 혼란스럽게하는 부분이라고 생각합니다. 일단 다른 스레드로 전환하면 다시 전환 한 다음 스레드 불일치를 발생시키지 않습니다. –
은 복합 객체 생성 스레드에있는 _Loop.Run() 내에서 DispatchMessage를 호출하지 않았습니까? – AlexandruC