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

Mac OS X: is it possible to imbue a non-main thread to become "The Main Thread" of a process?

本文关键字:进程 The Thread Main 线程 是否 OS Mac      更新时间:2023-10-16

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

  • 线程#1(也称为"主线程"):进入Main(),解析开关,如果需要,启动另一个线程(使用POSIX基元)
  • thread#2(也称为"GUI线程"):使用wxEntry初始化wxWidgets并显示GUI

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

NSUndoManager必须有一种方法来发现它在主线程之外运行(可能使用NSThread::isMainThread())。所以我的问题是:有可能就此欺骗NSUndoManager(以及Cocoa)吗?更好的是,将线程#2声明为"主线程",而将线程#1声明为次要线程?基本上,我需要一个API调用,比如"使调用线程成为主线程"。无文档的魔法和ObjectiveC++是不错的,只要它也能在OSX10.5上运行。

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

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