【问题标题】:NSNotification and MultithreadingNSNotification 和多线程
【发布时间】:2010-04-05 14:06:51
【问题描述】:

我正在尝试在我的多线程应用程序中获取通知 NSTaskDidTerminateNotification,但无法正常工作。当我在单线程应用程序上测试它时,它似乎确实有效。在init 我有[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(taskDidEnd:) name: NSTaskDidTerminateNotification object: myTask];,我很确定它会被调用,因为其他对象(如myTask)正在那里启动。而taskDidEnd: 方法定义为

- (void)taskDidEnd: (NSNotification *)aNotification
{
     NSLog(@"Task succeeded.");
}

在 dealloc 中,观察者被移除。

这一切都发生在一个在单独线程中启动的对象中,我希望在同一个对象中接收该通知。

【问题讨论】:

  • 顺便说一句,你在一个线程上这样做是有原因的吗?任务(进程)已经倾向于在其他处理器上调度,并且运行循环自然会处理不常见的离散事件,例如 NSTasks 完成。
  • 搜索了很长时间后,我发现不是 NSTask 没有响应,而是其他问题。这让我摆脱了线程。谢谢你问我为什么需要一个,否则我不会发现问题。

标签: cocoa multithreading nsnotifications nstask


【解决方案1】:

您是否在该线程上运行了运行循环?如果没有,NSTask 不会注意到任务已经结束(或者任务还没有结束)并且不会发布通知。

【讨论】:

  • 我在 init 中尝试过 [[NSRunLoop currentRunLoop] run] 但这似乎没有帮助。我是否以错误的方式使用它?
  • 第二个线程中的对象(我在detachNewThreadSelector:toTarget:withObject:中指定的那个)
  • 您在向它发送消息后初始化对象?这是没有意义的。如果要在该线程上接收通知,则需要在该线程上运行任务和运行循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多