【问题标题】:Pass a class as argument to a NSThread将类作为参数传递给 NSThread
【发布时间】:2021-07-26 20:39:08
【问题描述】:

如何使用 NSThread 将类作为参数传递给线程。在 Windows 中,我正在做类似的事情:

DWORD WINAPI threadFunc(LPVOID mpThis) {
    MYCLSS *pThis = reinterpret_cast<MYCLSS*>(mpThis);
  ....

void MYCLSS::func() {
  CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc, (void*)this, 0, NULL);
  ....

对于 Mac,我还没有找到任何此类示例。请帮帮我

【问题讨论】:

  • 建议:不要像用另一种语言那样尝试用一种语言进行编程。它几乎总是会导致疼痛。您可能无法找到您要查找的内容,因为您期待的是 C/C++ 思维而不是 Objective C 思维。
  • 您不必使用NSThread 在 MacOS 上启动新线程。你应该可以使用std::thread。

标签: c++ objective-c macos nsthread


【解决方案1】:

我找到了解决办法,可以像windows一样

class CLS_CPP {
public:
  void Func();
  void Check();
  int var_check;
};

@interface CLS_OSX : NSObject {
@public
  void *obj;
}
-(void)osx_thread;
@end
@implementation CLS_OSX
-(void)osx_thread {  
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    CLS_CPP *pThis = reinterpret_cast<CLS_CPP*>(obj);
  pThis->Check();
  NSLog(@"Check var %d", pThis->var_check);
  [NSThread exit];
  [pool drain];
}
@end

void CLS_CPP::Func() {
  var_check=77;
  CLS_OSX *trgt=[[CLS_OSX alloc] init]; 
  trgt->obj=(void*)this;
  [NSThread detachNewThreadSelector:@selector(osx_thread) toTarget:trgt withObject:trgt];
}
void CLS_CPP::Check() {
  NSLog(@"CLS_CPP::Check success");
}

int main(int argc, char ** argv) {
     
  CLS_CPP oAPP;
  oAPP.Func();  
    
}

【讨论】:

  • 我收到一个错误,我不知道它来自:objc[862]:NSThread 类的对象 0x100114020 自动释放,没有适当的池 - 只是泄漏 - 在 objc_autoreleaseNoPool() 上中断以进行调试。有什么想法吗?
  • 你需要一个自动释放池。要么是因为您在运行循环或调度队列中的线程中运行,要么是因为您手动创建了 NSAutoreleasePool。所有这些都是一个非常不标准的模式。你在'osx_thread'中做什么?如果是与系统进行任何形式的交互,则不太可能按预期工作。
  • 我不明白你在说什么......它已经按照我想要的方式工作了,除了这个错误。
  • 不是所有的代码,主要是 while (true) { sleep(60); }
  • 解决它,需要在 main() 或 CLS_CPP::Func() 上使用 AutoreleasePool
猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2014-12-27
  • 2019-03-02
  • 2015-12-26
  • 2013-01-27
  • 2012-06-09
相关资源
最近更新 更多