#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
.
Ответ №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()