Tôi đã kiểm tra cách này được xử lý trong MFC, và có vẻ như UI thread được xác định từ constructor:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\appcore.cpp:
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
...
m_nThreadID = ::GetCurrentThreadId();
Và sử dụng MFC gọi AfxGetApp()->m_nThreadID
bạn có thể tìm ra thread UI ID.
Tuy nhiên - cách tiếp cận này không hoạt động nếu .dll được tải không từ chủ đề chính - sau đó thậm chí cách tiếp cận của MFC sẽ không hoạt động - AfxGetApp()->m_nThreadID
sẽ trả về một thứ khác không phải là chuỗi chính.
Nhưng thông thường .dll của bạn được tải từ chuỗi chính, nhưng .dll của bạn không được bật mfc cần thiết. Tôi có thể khuyên bạn nên tiếp cận như sau:
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
Nếu .dll được tải bởi chuỗi giao diện người dùng chính, bạn sẽ nhận được id chủ đề chính xác từ cuộc gọi hàm (GetMainThread class).
Remove AfxGetApp()
cuộc gọi nếu bạn không cần đến chúng (Trong ứng dụng của tôi, tôi cần những)
Có vẻ tốt, cảm ơn bạn! –
Câu trả lời này sẽ tốt hơn nếu nó có một số giải thích về mã và cách hoạt động của mã. Đặc biệt, làm cách nào để bạn xác định chủ đề "chính" là của một quy trình cụ thể trong trường hợp quá trình đó có nhiều luồng? Có vẻ như tôi đang dựa vào thời gian tạo chuỗi. Đó không nhất thiết là một phương pháp phỏng đoán đáng tin cậy; điều quan trọng là chỉ ra rằng mọi người có thể xem xét cẩn thận những lợi thế và bất lợi của phương pháp này. Câu trả lời có chứa * chỉ * mã không phải là câu trả lời. –