Передайте класс в качестве аргумента NSThread

#c #objective-c #macos #nsthread

Вопрос:

Как я могу передать класс в качестве аргумента потоку, используя 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 я не нашел ни одного примера такого рода. Пожалуйста, помогите мне

Комментарии:

1. Рекомендация: Не пытайтесь программировать на одном языке так, как вы бы делали на другом. Это почти всегда приводит к боли. Возможно, вы не сможете найти то, что ищете, потому что вы ожидаете мышления на языке C/C , а не объективного мышления на языке C.

2. Вам не нужно использовать NSThread для запуска нового потока на macOS. Вы должны уметь пользоваться std::thread .

3. developer.apple.com/documentation/foundation/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();  
    
}
 

Комментарии:

1. Я получаю ошибку, из — за которой я не знаю, от чего она: objc[862]: Объект 0x100114020 класса NSThread автоматически выпущен без пула — просто утечка-перерыв в objc_autoreleaseNoPool() для отладки. Есть какие-нибудь идеи?

2. Вам нужен пул авторелиза. Либо потому, что вы работаете в потоке в цикле выполнения или очереди отправки, либо потому, что вы вручную создали пул NSAutoreleasePool. Все это очень нестандартная схема. Что вы делаете в «osx_thread»? Если это какое-либо взаимодействие с системой, оно вряд ли будет работать так, как ожидалось.

3. Я не понимаю, о чем ты говоришь… Это уже работает так, как я хочу, за исключением этой ошибки.

4. Это не весь код, в основном был while (true) { sleep(60); }

5. Решите это, нужен пул AutoreleasePool на main() или на CLS_CPP::Func()