AppleScript和崩溃
问题描述:
我想从我的C++应用程序执行一个苹果脚本,但我仍然没有成功使它稳定。 我的第一种方法是用碳API:AppleScript和崩溃
-
::OSACompileExecute(Component, &ScriptTextDesc, kOSANullScript, kOSAModeNull, &ResultID);
我在哪里创建的组件每一个脚本执行,并在同一范围内将其释放。但我坚持这个问题:有时它试图释放组件时崩溃。所以似乎在脚本引擎中出现了一些问题,并以某种方式破坏了组件。 -
::OSACompileExecute(m_Component, &ScriptTextDesc, kOSANullScript, kOSAModeNull, &ResultID);
凡m_Component是在构造函数创建和应用程序执行期间所居住的ComponentInstance:所以我切换到另一种,但类似的方法我没有找到任何soultions。因此,在发布Component时发生的崩溃消失了,因为在应用程序运行时没有释放步骤。但是还有一个问题:当用户尝试注销时,弹出窗口显示“MyApp阻止注销”(类似这样),MyApp关闭。所以当我关闭这个弹出窗口时,我可以注销。所以看起来组件释放的问题做了一些事情,告诉系统它不能关闭。我没有在这里找到任何解决办法,所以我决定Sitch为到3的方法: -
可可 - NSAppleScript 解决方案是非常简单的小:
QString ExecuteAppleScript(const QString& strScriptText) { QString strResult; NSAutoreleasePool* Pool = [[NSAutoreleasePool alloc] init]; NSString* ScriptText = [[NSString alloc] initWithBytes:strScriptText.toUtf8().data() length:strScriptText.size() encoding:NSUTF8StringEncoding]; NSAppleScript* Script = [[NSAppleScript alloc] initWithSource:ScriptText]; if (Script) { NSDictionary* ErrorInfo = nil; NSAppleEventDescriptor* Result = [Script executeAndReturnError:&ErrorInfo]; if (Result) { strResult = QString::fromUtf8([[Result stringValue] UTF8String]); } else if (ErrorInfo) { QString strErrorInfo = QString::fromUtf8([[ErrorInfo description] UTF8String]); } } [ScriptText release]; [Pool release]; return strResult;
}
有在这里有一些Qt类,但它们不相关。所以,它的工作原理,但它与NSAppleScript胆量,日志的一个内部不同的地方崩溃了:
Thread 5 Crashed:
0 com.apple.applescript 0x000000010ff0a4c9 ASCoerceToDesc(unsigned int, unsigned int, int, AEDesc*) + 84
1 ...ple.CoreServices.CarbonCore 0x00007fff86545e48 CallComponentFunction + 28
2 com.apple.applescript 0x000000010ff05cb1 AppleScriptComponent + 1728
3 com.apple.applescript 0x000000010ff1ebd0 AGenericCall::Delegate(ComponentInstanceRecord*) + 46
4 com.apple.applescript 0x000000010ff1e524 AGenericManager::HandleOSACall(ComponentParameters*) + 54
5 com.apple.applescript 0x000000010ff1e4b4 GenericComponent + 219
6 com.apple.openscripting 0x00007fff8716ae34 OSACoerceToDesc + 65
7 com.apple.Foundation 0x00007fff87c61a83 -[NSAppleScript(NSPrivate) _executeWithMode:andReturnError:] + 170
所以现在我不知道我能做到克服这些AppleScript的崩溃还有什么...
附加信息:
- AppleScript经常执行,每秒至少执行1个脚本。
-
Script是(只是把它从C++代码):
做shell脚本\ “名为ioreg -c IOHIDSystem” “| perl的-ane“如果(/空闲/){$闲置=(弹出@ F)/ 1000000000; print $ idle,\\“\\”; last}'\“
- AppleScipt不是从主线程执行的。我听说10.6.6之前的MacOS X版本上NSAppleScript出现问题,但是我在10.6.7上测试了它。无论如何,1和2方法不应该受到线程的困扰。
- 崩溃是随机的。所以它可以全天工作,也可以在开始后立即开始工作。
任何人都可以帮助我吗? 提前谢谢!
答
你提到你正在从不同的线程运行NSApplescript。如果您对NSApplescript文档中看看,右顶部,它说的:
Important: You should access NSAppleScript only from the main thread.
因此,只要知道它不是线程安全,这或许对你的问题的原因。
编辑:我在代码中看到其他一些问题。首先,你不释放你使用alloc/init创建的“脚本”。接下来,这是主要问题......您的“ErrorInfo”是一个包含键/值对的字典。你没有使用键来获取值,这就是你的崩溃发生的地方。它无法返回字典的“描述”。下面是我用来创建该错误字典的NSString的示例代码,所以请执行此类操作。
NSString* errorInfo = [NSString stringWithFormat:@"Error:%@ %@", [errorDict valueForKey:@"NSAppleScriptErrorNumber"], [errorDict valueForKey:@"NSAppleScriptErrorMessage"]];
最后,你是否使用了像“performSelectorOnMainThread”这样的方法来确保它在主线程上运行?
嗯,我已经看到了一些10.6.6更改日志,其中有一条声明表示NSAppleScript变得线程安全。另一方面官方文件反过来说。我会尝试在主线程 – ixSci 2011-05-28 07:06:56
@ regulus6633内使用它,但它没有帮助。我将NSAppleScript执行转移到主线程中,并且崩溃了 – ixSci 2011-05-30 06:15:23
我在上面的代码中添加了一个编辑部分,这应该有所帮助。 – regulus6633 2011-05-30 16:49:04