如何在运行时停止运行

时间:2013-08-09 15:32:28

标签: xcode macos applescript exit

我正在使用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
对不起,我是日本人,我不会写得很好。

2 个答案:

答案 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