Sprawdziłem jak to jest obsługiwane w MFC, a wygląda na to, wątek UI jest określana z konstruktora:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\appcore.cpp:
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
...
m_nThreadID = ::GetCurrentThreadId();
i za pomocą połączenia MFC AfxGetApp()->m_nThreadID
można dowiedzieć się identyfikator wątku UI.
Jednak - to podejście nie działa, jeśli plik .dll nie został załadowany z głównego wątku - wtedy nawet metoda MFC nie zadziała - AfxGetApp()->m_nThreadID
zwróci coś innego niż główny wątek.
Ale zazwyczaj twój plik dll zostanie wczytany z głównego wątku, ale twój plik .dll nie jest koniecznie włączony. Mam może zalecić podejścia tak:
class GetMainThread
{
public:
GetMainThread()
{
m_nThreadID = ::GetCurrentThreadId();
}
DWORD m_nThreadID;
}getMainThread;
DWORD getUIThread()
{
DWORD id = 0;
if(AfxGetApp() != NULL)
id = AfxGetApp()->m_nThreadID;
else
id = getMainThread.m_nThreadID;
return id;
} //getUIThread
Jeśli dll jest ładowany przez głównego wątku UI, otrzymasz prawidłowy identyfikator gwintu z rozmowy konstruktora (klasa GetMainThread).
Usuń AfxGetApp()
rozmowy, jeśli nie są potrzebne (W mojej aplikacji potrzebne ci)
Wygląda dobrze, dziękuję! –
Ta odpowiedź byłaby lepsza, gdyby zawierała pewne wyjaśnienia na temat tego, co robi kod i jak działa. W szczególności, w jaki sposób określasz "główny" wątek określonego procesu w przypadku, gdy proces ten ma wiele wątków? Wydaje mi się, że opierasz się na czasie tworzenia wątku. To niekoniecznie jest niezawodną heurystyką; ważne jest, aby wskazać, gdzie ludzie mogą dokładnie rozważyć zalety i wady tego podejścia. Odpowiedzi zawierające kod * tylko * nie są odpowiedziami. –