Bu MFC nasıl işleneceğini kontrol ettik ve UI iş parçacığı yapıcısı belirlenir benziyor:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\appcore.cpp:
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
...
m_nThreadID = ::GetCurrentThreadId();
Ve UI iş parçacığı kimliği anlayabiliriz MFC çağrısı AfxGetApp()->m_nThreadID
kullanarak.
Ancak - .dll ana iş parçacığından yüklenmemişse bu yaklaşım çalışmaz - daha sonra MFC'nin yaklaşımı çalışmaz - AfxGetApp()->m_nThreadID
ana iş parçacığından başka bir şey döndürür.
Ancak genellikle .dll dosyanız ana iş parçacığından yüklenir, ancak .dll dosyanız gerekli değildir. Böyle bir yaklaşım tavsiye verebilecek ettik:
.dll ana UI iş parçacığı tarafından yüklenirse
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
, sen yapıcı çağrısı (GetMainThread sınıfı) doğru iplik kodu oluşturulacaktır. Eğer onlara ihtiyacım yok
Kaldır AfxGetApp()
aramaları eğer
İyi görünüyor, teşekkürler! –
Bu cevap, kodun ne yaptığı ve nasıl çalıştığı hakkında bir açıklama içeriyorsa daha iyi olurdu. Özellikle, bu işlemin birden çok iş parçacığı olduğu durumda, "ana" iş parçacığının belirli bir işlemin ne olduğunu nasıl belirliyorsunuz? Bana, iş parçacığının yaratma zamanına dayanıyormuşsun gibi geliyor. Bu mutlaka güvenilir bir sezgisel değil; İnsanların bu yaklaşımın avantajlarını ve dezavantajlarını dikkatlice değerlendirebildiklerini belirtmek önemlidir. * Sadece * kodu içeren cevaplar cevap değildir. –