我正在使用Applescript在Xcode上编写Mac App
我做了一个不会永远停止的功能,但我无法阻止它
当我按下位于窗口上的按钮时,它就开始了
由于此功能不会停止,因此按钮会永久显示
我必须强制戒掉'Command + Option + Escape'。 (即使你做这个活动,这个应用程序可能不会停止。)
我想在功能开始前松开按钮,我想按下另一个按钮安全地停止这个功能
这是我的榜样。要停止此操作,请按下Xcode上的“停止”按钮。
property parent : class "NSObject"
property mylabel : missing value
on applicationWillFinishLaunching_(aNotification)
-- Insert code here to initialize your application before any files are opened
end applicationWillFinishLaunching_
on myStartButtonHandler_(sender)
my myForeverFunction()
end myStartButtonHandler_
on myStopButtonHandler_(sender)
--How can I stop "myForeverFunction"?
end myStopButtonHandler_
on myForeverFunction()
set a to 0
repeat 100 times
set a to a+1
mylabel's setStringValue_(a)
delay 1
end repeat
end myForeverFunction
on applicationShouldTerminate_(sender)
-- Insert code here to do any housekeeping before your application quits
return current application's NSTerminateNow
end applicationShouldTerminate_
这是项目文件 - > https://dl.dropboxusercontent.com/u/97497395/test.zip
对不起,我是日本人,我不会写得很好。
答案 0 :(得分:2)
基本上,您的应用程序界面在您的应用主线程上受到控制和更新。因此,如果您运行一些绑定主线程的代码,那么在代码完成之前,您的接口将无法自行更新。因此,要修复您在后台线程中运行代码,因此您的界面将能够自行更新。
我不知道你是否可以在AppleScriptObjC中这样做,因为我对它不太熟悉。这是我在objective-c中的表现。我创建一个处理程序(someHandler),然后运行此代码。请注意,由于此处理程序不在具有自动生成的发布池的主线程中运行,因此您必须在处理程序中创建并释放发布池。
[NSThread detachNewThreadSelector:@selector(someHandler) toTarget:self withObject:nil];
编辑 :这是您询问的自动发布池。在参考计数环境中这样做......
-(void)someHandler {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// do your stuff here
[pool drain];
}
使用自动参考计数(ARC),您可以这样做......
-(void)someHandler {
@autoreleasepool {
// do your stuff here
}
}
所以我不确定哪个适用于AppleScriptObjC。快速谷歌搜索出现this post。
答案 1 :(得分:1)
现在你的代码是循环和循环的,接口等重要的东西永远不会得到更新。如果您调用doEventFetch
函数来运行所有排队的进程,那么应该可以解决您的问题。每次循环都要调用一次:
on doEventFetch()
repeat
tell current application's NSApp to set theEvent to nextEventMatchingMask_untilDate_inMode_dequeue_(((current application's NSLeftMouseDownMask) as integer) + ((current application's NSKeyDownMask) as integer), missing value, current application's NSEventTrackingRunLoopMode, true)
if theEvent is missing value then
exit repeat
else
tell current application's NSApp to sendEvent_(theEvent)
end if
end repeat
end doEventFetch
on loopFunc()
repeat
#Repeat stuff here...
doEventFetch()
end repeat
end loopFunc