Meine Kamera-Lib ist jetzt langsam wirklich brauchbar. Darum habe ich jetzt ein Framework draus gebastelt, was ich jetzt erstmals aus einer Cocoa-Anwendung verwenden möchte.
Eine Testanwendung in C++ (mit OpenCV zum Darstellen der Bilder) funktioniert einwandfrei (mit einer dylib, noch kein Framework dafür, da sollte aber nix falsch sein, Code ist der Gleiche).
In Cocoa habe ich jetzt eine Anwendung mit einem "CapView" NSView, welches meine Kamera-Klasse im initWithFrame: instanziiert und das Capturing startet. Den NSLogs zufolge klappt das auch erwartungsgemäß problemlos.
Vorerst hole ich die Bilder jetzt nicht ab, und stell sie auch nicht dar. In meiner C++ Testanwendung kann ich das auch so machen, kein Problem.
Nach wenigen (Milli?) Sekunden stürzt meine Cocoa-Anwendung jetzt aber in den gdb, und bringt mir keinerlei Begründung dafür. Ein paar Ausschnitte aus dem gdb:
Alles anzeigen
Hier scheint diesmal "Thread 2" im nirgendwo zu liegen, kann ich mir grad auch nicht erklären.
Pthreads zum erzeugen von Threads + CFRunLoop sollte doch keine Probleme erzeugen, oder? Im C++ klappt das ja. Irgendwie hab ich das Gefühl, dass es sich mit dem Cocoa RunLoop beisst.
Irgendwer irgendwelche Ideen?
Ich versuche mal, ob ich herausfinden kann, welcher Thread da NULL ist, und warum. Muss ich bei Cocoa + pthreads + CFRunLoop irgendwie generell noch etwas beachten, was ich bei reinem C++ nicht muss?
Eine Testanwendung in C++ (mit OpenCV zum Darstellen der Bilder) funktioniert einwandfrei (mit einer dylib, noch kein Framework dafür, da sollte aber nix falsch sein, Code ist der Gleiche).
In Cocoa habe ich jetzt eine Anwendung mit einem "CapView" NSView, welches meine Kamera-Klasse im initWithFrame: instanziiert und das Capturing startet. Den NSLogs zufolge klappt das auch erwartungsgemäß problemlos.
Vorerst hole ich die Bilder jetzt nicht ab, und stell sie auch nicht dar. In meiner C++ Testanwendung kann ich das auch so machen, kein Problem.
Nach wenigen (Milli?) Sekunden stürzt meine Cocoa-Anwendung jetzt aber in den gdb, und bringt mir keinerlei Begründung dafür. Ein paar Ausschnitte aus dem gdb:
Quellcode
- (gdb) info threads
- 3 process 4905 thread 0x3703 0x968f5b6c in __semwait_signal ()
- 2 process 4905 thread 0x3137 0x00000000 in ?? ()
- * 1 process 4905 thread 0x10b 0x968ef158 in mach_msg_trap ()
- (gdb) bt
- #0 0x968ef158 in mach_msg_trap ()
- #1 0x968f6080 in mach_msg ()
- #2 0x90981558 in CFRunLoopRunSpecific ()
- #3 0x93c19bc8 in RunCurrentEventLoopInMode ()
- #4 0x93c199ec in ReceiveNextEventCommon ()
- #5 0x93c1982c in BlockUntilNextEventMatchingListInMode ()
- #6 0x92023728 in _DPSNextEvent ()
- #7 0x920230e0 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
- #8 0x9201cd9c in -[NSApplication run] ()
- #9 0x91fed7a0 in NSApplicationMain ()
- #10 0x000025fc in main (argc=1, argv=0xbffff550) at /Volumes/E/code/svn.ioctl.eu/_UVC_/UVCCap/main.m:13
- (gdb) thread 2
- [Switching to thread 2 (process 4905 thread 0x3137)]
- 0x00000000 in ?? ()
- (gdb) bt
- #0 0x00000000 in ?? ()
- (gdb) thread 3
- [Switching to thread 3 (process 4905 thread 0x3703)]
- 0x968f5b6c in __semwait_signal ()
- (gdb) bt
- #0 0x968f5b6c in __semwait_signal ()
- #1 0x969323d0 in _pthread_cond_wait ()
- #2 0x0003b6a8 in usb::isoch_transfer::wait_for_data (this=0x12ef50) at /Volumes/E/code/svn.ioctl.eu/_UVC_/uvc/src/usb_isoch.cpp:190
- #3 0x0004bf64 in uvc::decode_frame::worker_func (vme=0x12fc50) at /Volumes/E/code/svn.ioctl.eu/_UVC_/uvc/src/uvc_decode_frame.cpp:114
- #4 0x96931028 in _pthread_start ()
Hier scheint diesmal "Thread 2" im nirgendwo zu liegen, kann ich mir grad auch nicht erklären.
Pthreads zum erzeugen von Threads + CFRunLoop sollte doch keine Probleme erzeugen, oder? Im C++ klappt das ja. Irgendwie hab ich das Gefühl, dass es sich mit dem Cocoa RunLoop beisst.
Irgendwer irgendwelche Ideen?
Ich versuche mal, ob ich herausfinden kann, welcher Thread da NULL ist, und warum. Muss ich bei Cocoa + pthreads + CFRunLoop irgendwie generell noch etwas beachten, was ich bei reinem C++ nicht muss?
♥C++