【问题标题】:Mac OS X: is it possible to imbue a non-main thread to become "The Main Thread" of a process?Mac OS X:是否可以让非主线程成为进程的“主线程”?
【发布时间】:2011-09-04 22:29:20
【问题描述】:

我在 Mac OS X (10.6.7) 下遇到了与 GUI/线程相关的问题。 我正在使用 wxWidgets 框架(版本 2.9.1),在我的例子中它依赖于 Cocoa。应用设计是这样的:

  • 线程 #1(又名“主线程”):进入 main(),解析开关,并在必要时启动另一个线程(使用 POSIX 原语)。
  • 线程 #2(又名“GUI 线程”):使用 wxEntry 初始化 wxWidgets 并显示 GUI。

与大多数其他 GUI 框架一样,Cocoa 不是线程安全的,因此我们确保在线程 #2 中执行所有 GUI 调用,并在需要时传递消息。 然而,在这种特殊情况下,在初始化期间(从 NSUndoManager 更准确地说)从 Cocoa 内部提出了一个断言,本质上说“在主线程之外使用我是不安全的”。即使线程 #2 是 主线程,就任何与 GUI 相关的内容而言。

嗯,NSUndoManager 必须有办法找出它是否在主线程之外运行(可能使用 NSThread::isMainThread())。所以我的问题是:是否有可能以此欺骗 NSUndoManager (以及一般的 Cocoa)?更好的是,声明线程#2 为“主线程”,线程#1 成为次要线程?基本上,我需要一个 API 调用,例如“使调用线程成为主线程”。只要在 OS X 10.5 上也能正常工作,无证巫术和 Objective C++ 都可以。

P.P.现在的代码可以在 Windows/Linux/MacOSX+Carbon 下完美运行。此外,重新设计它以更改线程结构将是一个巨大的痛苦。

【问题讨论】:

  • 线程#1 在应用程序生命周期内做什么?
  • [NSThread isMultiThreaded] 是否返回 YES?您需要使用 NSThread 为 Cocoa 生成至少一个线程以启用多线程支持。
  • 为什么不使用主线程进行 GUI 和其他线程的其余工作?
  • @John,线程#1 产生了一些其他线程,并在某种事件循环中等待事件。它基本上组织了一切。 @LaC,感谢您的指点,我会检查一下。 @wilx,正如我所说,我可以将主线程用于 GUI,但这需要重新设计,因为在我们的例子中,GUI 是可选的 - 它可能不需要,但应用程序可能仍需要执行所有其他工作。本质上,GUI 仅用于可视化正在完成的工作。
  • 我不知道造成这种情况的实现细节是什么,但我记得有一次做你正在做的事情(一个线程中的 GUI 和事件循环,而不是调用的线程main 在 Mac OS 上)和系统库会变得非常混乱。例如,它会在第一次与 GUI 相关的调用时崩溃或死锁。我会想办法让自己从main 打来电话。如果您的应用程序设计得很好,我不确定为什么它会是一个“巨大的痛苦”,所以我鼓励您更加努力地思考它。结果会比热补丁 Cocoa 或一些这样的黑客更好。

标签: c++ multithreading cocoa macos wxwidgets


【解决方案1】:

好的,所以根据您的评论:您基本上不会逃避代码的重构。大多数 GUI 系统都使用主线程并自己处理事件循环。但是如果你说 GUI 是可选的,也许最好将你的应用程序分成两个——worker 和 GUI。 GUI 可以通过多种方式与工作人员通信,具体取决于平台/特定需求。

【讨论】:

  • 顺便说一句,wxWidgets 开发人员向我保证,就 wxWidgets 而言,调用 wxEntry() 的线程是主线程,这允许您使用程序中的任意线程结构,只要所有 GUI 处理只发生在一个线程内(至少 Win32 API、GTK 甚至 OS X 上的 Carbon 都允许这样做)。然而 Cocoa 强制执行这个特定的限制,因此我在这里发布了这个问题。所以,我有点接受重新设计我的代码的前景。但是,当然,如果一个简单而快速的 hack 就可以做到这一点,那就更好了......
  • @LaC,isMultiThreaded 返回“是”,我做了保护 Cocoa 框架所需的操作,如 here 所述
  • 您可以在应用程序生命周期的最开始创建新线程,在新线程中调用旧的main(),然后不再创建“GUI线程”,而是使用主线程作为GUI线程。
猜你喜欢
  • 2022-11-04
  • 2019-04-30
  • 2021-01-05
  • 2010-09-26
  • 2020-09-21
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多