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

标签 c++ multithreading cocoa macos 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 调用,例如“使调用线程成为主线程”。只要在 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/

相关文章:

c++ - 在C++中写两个不同类型的变量

C++使用来自不同文件中包含的类的函数的无效参数

c# - yield return 的线程安全性(是吗?)

cocoa - 如何从 Mac 应用程序发送邮件

swift - Cocoa:如何使用 NSDocument 从另一个应用程序更改文件后重新读取文件内容?

c++ - C# @ 符号前缀字符串的 C++ 等价物是什么?

c++ - 如何在 Linux 上的 IDE 中使用 C++ 代码的文档?

c++ - std::mutex 如何在不同的线程中解锁?

python - 如何让子线程处理Python中的主进程被杀死或关键中断?

objective-c - CAGradientLayer 类型——有什么意义?