StatusItem菜单在打开时阻止主线程。解决方法?

时间:2010-10-02 03:45:16

标签: objective-c macos nsthread nsrunloop

我为Mac编写了一个设计为状态栏项目的应用程序。但是,当用户从状态栏打开其菜单时,主运行循环将被阻止,直到它关闭为止。由于此应用程序响应套接字上的消息,因此在菜单打开时它无法执行任何操作。

我已尝试从单独的线程设置状态项,并在另一个线程上调度套接字,但没有骰子。有没有一个很好的方法来解决这个问题?

更新

我现在已经解决了这个问题。我使用的是NetSocket套接字包装器,它的异步特性使得在不同的线程上打开和监视非常困难。我切换到SmallSockets(另一个Objective-C套接字包装器),因为它是同步的,我能够打开一个套接字,直接在一个单独的线程上看它。

1 个答案:

答案 0 :(得分:2)

当用户与菜单交互时,运行循环在事件跟踪模式下运行。也可以将套接字连接到NSEventTrackingRunLoopMode模式,并在用户与菜单交互时继续运行。

但是将套接字放在另一个线程上也应该有效。如果这对你不起作用,你可能做错了什么,但没看到我不能说的代码。