我在 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 下完美运行。此外,重新设计它以更改线程结构将是一个巨大的痛苦。
最佳答案
好的,所以根据您的评论:您基本上不会逃避代码的重构。大多数 GUI 系统都使用主线程并自己处理事件循环。但是如果你说 GUI 是可选的,也许最好将你的应用程序分成两个——worker 和 GUI。 GUI 可以通过多种方式与工作人员通信,具体取决于平台/特定需求。
关于c++ - Mac OS X : is it possible to imbue a non-main thread to become "The Main Thread" of a process?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6178618/