Cocoa 应用程序界面随机“断开”程序代码

Posted

技术标签:

【中文标题】Cocoa 应用程序界面随机“断开”程序代码【英文标题】:Cocoa app interface randomly "disconnecting" from program code 【发布时间】:2010-10-19 14:56:55 【问题描述】:

我有一个处理图像的多线程 Cocoa 应用程序。该程序有一个进度条和一些显示该过程的进度的文本。这一切都很好。但是,有时界面会冻结,一切都会停止更新。进度条停止移动,百分比计数器中的文本停止更新。但是,实际过程仍然有效!我有一个 NSBeep() 在程序完成时触发,即使 UI 不再更新,我仍然听到它。就好像 UI 只是与代码断开了连接。

另一个奇怪的问题是,有时当用户想要选择文件时打开的 NSOpenPanel 将只是一个白色的空白。我在主线程中声明了 NSOpenPanel(我正在使用 [NSOpenPanel openPanel]),这有帮助(我一开始尝试保留它,但没有奏效)。我不知道这是否相关,但任何想法将不胜感激!

我在 Mac OS X 10.5.8 上使用 Xcode 3.1.1 (GCC 4.2)。

【问题讨论】:

工作线程如何连接到 UI:委托、通知、KVO?你的 UI 代码是在主线程上执行的吗? 【参考方案1】:

您正试图从其他线程操作 UI。如文档中所述,AppKit 通常不是线程安全的,您应该在主线程上与您的 GUI 进行交互。见-performSelectorOnMainThread:withObject:waitUntilDone:。

【讨论】:

这正是我需要的答案。我回去更新了我的代码,以确保没有线程接触 UI。过去几个小时我一直在测试它,现在它似乎工作得很好!谢谢! 另一个问题:如果我需要从线程查询(而不是更改)NSButton 的状态怎么办?这不是在技术上与 UI 交互吗? 你不应该。您的按钮应该在控制器中设置某种状态。询问控制器。 知道了。我将复选框连接到在应用程序控制器中设置 BOOL 变量的方法。然后我从线程中检查,而不是直接检查 IBOutlet。再次感谢!

以上是关于Cocoa 应用程序界面随机“断开”程序代码的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa App 窗口有随机焦点

通过 websockets 的 Socket.io - 随机“传输端”断开连接

[深入浅出Cocoa]iOS程序性能优化

UI - Cocoa Touch框架

多点连接随机断开

了解应用程序在 cocoa mac OSX 中是不是处于非活动状态的最佳方法?