我在Mac OS X(10.6.7)下遇到了与GUI/线程相关的问题。
我正在使用wxWidgets框架(版本2.9.1),并且在我的案例中,它基于Cocoa。应用程序设计如下:
- 线程#1(也称为“主线程”):输入main(),解析开关,如果必要,在另一个线程中启动(使用POSIX原语)
- 线程#2(也称为“GUI线程”):使用wxEntry初始化wxWidgets并显示GUI。
与大多数其他GUI框架一样,Cocoa不是线程安全的,因此我们确保从线程#2中进行所有GUI调用,必要时传递消息。 然而,在这种情况下,Cocoa的内部会在初始化期间(更准确地说,来自NSUndoManager)引发断言,指出“在主线程之外使用我不安全”。即使线程#2作为任何与GUI相关的内容方面的主线程。
好吧,NSUndoManager必须有一种方法来找出它正在运行的是否是主线程(可能使用NSThread::isMainThread())。所以我的问题是:是否可能欺骗NSUndoManager(和Cocoa通常)关于此事?甚至更好的是,将线程#2声明为“主线程”,线程#1成为次要的?基本上,我需要一个API调用,例如“使调用线程成为主要线程”。文档未知的巫术和Objective C++是可以接受的,只要它在OS X 10.5上也可以运行。
附:现有代码在Windows/Linux/MacOSX+Carbon下均可无缺地运行。此外,重新设计以更改线程结构将是一件非常麻烦的事情。
[NSThread isMultiThreaded]
返回YES
吗?你需要使用 NSThread 至少生成一个线程,才能让 Cocoa 开启多线程支持。 - LaC