【问题标题】:How to know if code is running on the ui thread or a working thread (MFC Visual C++)如何知道代码是在 ui 线程还是工作线程上运行(MFC Visual C++)
【发布时间】:2010-10-29 05:11:42
【问题描述】:

我有一个从应用程序中的不同线程调用的函数。 我需要知道执行代码的线程是主线程(ui线程)还是工作线程。

有什么建议吗?

谢谢。

【问题讨论】:

标签: multithreading visual-c++ mfc user-interface


【解决方案1】:

如果您使用的是 MFC 应用程序,请使用以下代码。

if(GetCurrentThreadId() == AfxGetApp()->m_nThreadID)
{
    //Main Thread
}
else
{
    //Not Main Thread
}

【讨论】:

  • 我发现了一件奇怪的事情 - WinAPI 函数IsGUIThread() 旨在做完全相同的事情,无法检测到非 GUI 线程。您的解决方案有效,但 IsGUIThread(FALSE) 始终为我的所有后台线程返回 TRUE。
【解决方案2】:

使用 GetCurrentThread()GetCurrentTreadId() 并将其与已知的 HANDLE 或主线程的 id 进行比较。

不能有多个 UI 线程吗?

当然可以,但只有一个 main ui 线程。

好的。但是,有没有办法知道 主线程的 HANDLE 或 ID 来自 这段代码?我的意思是 GetMainThread 或 GetMainThreadID。一世 不想修改其他部分 应用程序(如果可能)。顺便提一句, 谢谢你的回答。

对不起,我出去吃午饭了,你已经得到了答案。但还是不妨回复一下。 GetCurrentThreadId() 当然可以在你的主 ui 线程执行期间使用,并被缓存以供以后比较。在您的应用程序执行期间的某个地方,将只有一个线程,例如在创建任何其他线程之前在 WinMain() 中。

干杯!

【讨论】:

  • 好的。但是,有没有办法从这段代码中知道主线程的 HANDLE 或 ID?我的意思是像 GetMainThread 或 GetMainThreadID 这样的东西。我不想修改应用程序的其他部分(如果可能)。顺便说一句,谢谢你的回答。
  • 请注意 MSDN 关于 GetCurrentThread 的说法:“该函数不能被一个线程使用来创建一个句柄,该句柄可以被其他线程用来引用第一个线程。句柄总是被解释为引用使用它的线程。通过在调用 DuplicateHandle 函数时将伪句柄指定为源句柄,线程可以为自己创建一个“真实”句柄,该句柄可以由其他线程使用或由其他进程继承。 ...据我了解,当您尝试在多个线程上使用 GetCurrentThread 返回的句柄时,您还需要调用 DuplicateHandle。
【解决方案3】:

AfxGetApp()->GetMainWnd()

如果从主线程调用,将返回与 AfxGetMainWnd() 将返回的相同的内容。

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2014-09-27
    • 2018-09-13
    • 2023-03-22
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多