Mac OS X:是否可以将非主线程灌输成为进程的"主线程"?

anr*_*eff 13 c++ macos cocoa multithreading wxwidgets

我在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调用,如"让调用线程成为主要线程".没有文档的魔法和Objective C++也很好,只要它也可以在OS X 10.5上运行.

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

Joh*_*ohn 1

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

  • 您可以在应用程序生命周期的一开始创建新线程,在新线程中调用旧的“main()”,然后使用主线程作为 GUI 线程,而不是创建“GUI 线程”。 (3认同)
  • 顺便说一句,wxWidgets 开发人员向我保证,就 wxWidgets 而言,调用 wxEntry() 的线程是*主线程*,这允许您在程序中使用任意线程结构,只要所有 GUI 处理只发生在一个线程内(至少 Win32 API、GTK 甚至 OS X 上的 Carbon 都允许这样做)。然而 Cocoa 强制执行这个特定的限制,因此我在这里发布了这个问题。所以,我有点放弃了重新设计代码的前景。但当然,如果一个简单而快速的黑客就能做到这一点,那就更好了...... (2认同)