GCD и AppleEvents / NSOperationQueue и AppleScript

Как я понял, потоки, предоставляемые GCD, имеют runloop, но не имеют источника / порта. Теперь я использую некоторые методы, которые вызывают AppleScripts через AppleEvents внутри NSOperationQueue. И иногда мое приложение вылетает со следующей трассировкой стека.

мои вопросы:

  • Использование AppleScript внутри NSInvocationOperation или NSBlockOperation
  • Использование AppleEvents внутри GCD-Threads
  • мне нужно добавить источник / порт в runloop gcd-потока перед использованием AppleEvents?
  • мне нужно добавить источник / порт в runloop gcd-потока перед использованием [CATransaction commit]?
  • мне нужно добавить источник / порт в runloop gcd-потока перед использованием [NSObject executeSelectorAfterDelay...]?
  • если да, то как?
  • могу я просто вызвать CFRunLoopRunInMode(kCFRunLoopDefaultMode, 5.0, false); /// или 30 или определенный тайм-аут appleevent?
.. Поток 9: Очередь отправки: com.apple.root.default-priority
0 libSystem.B.dylib 0x00007fff88276e82 semaphore_wait_signal_trap 10
1 libSystem.B.dylib 0x00007fff8827c3cd pthread_mutex_lock 469-й код приложения, 50-й код приложения. 0x000000011d3edbcc AGenericCall::Delegate(ComponentInstanceRecord*) 46
4 com.apple.applescript 0x000000011d3ed520 AGenericManager::HandleOSACall(ComponentParameters*) 54
5 com.apple.applescript 0x000000011ffeffer 0x00007fff86f320d8 -[NSAppleScript(NSPrivate) _executeAppleEvent:withMode: ошибка:] 161
8 ххх 0x0000000100048af0 -[TCallScript callScript:withArrayOfParameters:] 480
9 ххх 0x0000000100048ffd -[TCallScript callHandler:withParameters:] 477
10 ххх 0x0000000100036032 -[ZFOpenWindowController getSafariItemForCurrentTabForWindow:] 66
11 xxx 0x00000001000346af -[ZFOpenWindowController refreshWindowList:] 12 тысяча шестьсот семьдесят девять ххх 0x000000010003541c -[ZFOpenWindowController bringZFToForegroundZoomOut:orJustLinkFrontMost:toItem:] 2988
13 ххх 0x0000000100053556 __-[ZFSelectionTool openWithPreferredApplication:]_block_invoke_516 54
14 com.apple.Foundation 0x00007fff86ed87d9 -[NSBlockOperation главную] 140
15 com.apple.Foundation 0x00007fff86ec906d -[__NSOperationInternal начать] 681
16 com.apple.Foundation 0x00007fff86ec8d23 ____startOperations_block_invoke_2 99
17 libSystem.B.dylib 0x00007fff882b2ce8 _dispatch_call_block_and_release 15
18 libSystem.B.dylib 0x00007fff88291279 _dispatch_worker_thread2 231
19 libSystem.B.dylib 0x00007fff88290bb8 _pthread_wqthread 353
20 libSystem.B.dylib 0x00007fff88290a55 start_wqthread 13


... Поток 11 аварийно завершен: очередь отправки: приоритет com.apple.root.default 0 com.apple.applescript 0x000000011d40f658 BCHandleError() 182
1 com.apple.applescript 0x000000011d4059ca UASExecute1() 2546
2 com.apple.ex000000 AEDesc const*, без знака int, int, unsigned int*) 695
3 ...ple.CoreServices.CarbonCore    0x00007fff85388e04 CallComponentFunction 28
4 com.apple.applescript 0x000000011d3d4cad AppleScriptComponent 1728
5 com.apple.applescript 0x00000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, накоплено, веб-сайт::HandleOSACall(ComponentParameters*) 54
7 com.apple.applescript 0x000000011d3ed4b0 GenericComponent 219
8 com.apple.openscripting 0x00007fff8381c6da OSAExecuteEvent 63
9 com.apple. - [TCallScript callScript: withArrayOfParameters: 480] 11 ххх 0x0000000100048ffd -[TCallScript callHandler:withParameters:] 477
12 ххх 0x0000000100035c67 -[ZFOpenWindowController getItemForAXDocumentOfFrontMostWindow] 119
13 ххх 0x00000001000359f1 -[ZFOpenWindowController getItemForFrontMostWindow:] 721
14 ххх 0x00000001000348ac -[ZFOpenWindowController bringZFToForegroundZoomOut:orJustLinkFrontMost:toItem:] 60
15 xxx 0x0000000100053556 __-[ZFSelectionTool openWithPreferredApplication:]_block_invoke_516 54
16 com..Foundation 0x00007fff86ec8d23 ____startOperations_block_invoke_2 99
19 libSystem.B.dylib 0x00007fff882b2ce8 _dispatch_call_block_and_release 15
20 libSystem.B.dylib 0x00007fff88291279 _dispatch_worker_thread2 231
21 libSystem.B.dylib 0x00007fff88290bb8 _pthread_wqthread 353
22 libSystem.B.dylib 0x00007fff88290a55 start_wqthread 13

1 ответ

Решение

Обратите внимание, что компонент AppleScript имеет ограниченную безопасность потоков. Начиная с 10.6, вы можете использовать его в неосновных потоках, но вам нужно будет создать новый ComponentInstance для каждого потока. Я думаю, что вы можете сделать это с OSAKit, в противном случае вам придется прибегнуть к грубому Carbon API. Что лучше всего, на самом деле зависит от того, чего вы пытаетесь достичь (например, запускаете ли вы предоставленные пользователем сценарии или сценарии, жестко запрограммированные в вашем приложении, и какова мотивация для их запуска через NSOperationQueue).

Другие вопросы по тегам