> > Hi Jason > > I haven't attempted to debug your code but I use NSTask extensively and have > experienced some of the problems you describe. > > In each case I was not correctly handling the asynchronous availability of > data in the pipe ie: there is nothing wrong with the approach but > implementation is all. > > In my case I found that the implementation detailed in the following sample > worked with great reliability on GC apps (search the xcode docs): > > > This sample uses NSFileHandle - waitForDataInBackgroundAndNotify. > This generates a single notification with all the available data - which may > or may not be suitable for your needs. > > The sample above calls NSTask - waitUntilExit but that is only a detail I > think. > > If this was my project I would instigate a branch that implemented the > approach detailed in CommandLineToolPlugin.m and see where that got me. > It should have fewer moving parts at least. > > Regards > > Jonathan Mitchell > > Developer > Mugginsoft LLP > http://www.mugginsoft.com
Hi Jonathan, Thanks for looking at this! It's good to know I am not going crazy and there is some subtle thing I am doing wrong here... Just to clarify you mean this example here: http://developer.apple.com/library/mac/#samplecode/CommandLineTool/Listings/CommandLineToolPlugIn_m.html for the CommandLineToolPlugin.m? I hadn't seen this approach at the end of using [task waitUntilExit] after you have set up the observers and notifications. I had seen in eg OpenFileKiller: http://cocoawithlove.com/2009/05/invoking-other-processes-in-cocoa.html and in https://bitbucket.org/snej/myutilities/src/tip/MYTask.m where a run loop is used. Ie something like: - (void)launchTaskAndRunSynchronous { [task launch]; BOOL isRunning = YES; while (isRunning && (!taskComplete || !outputClosed || !errorClosed)) { isRunning = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } } (Also just glancing at the code, I noticed a couple of really small things... the date at the top of CommandLineToolPlugin.m lists 2009 yet its using old style NS_DURING, NS_HANDLER, NS_ENDHANDLER which seems a little strange... but its not wrong or anything, just a little well strange. Also it looks like CommandLineToolPlugin.m sets [task setStandardInput:inPipe] whereas I have no input.. Again just small differences. I will have a play and get back to the group.) Thanks! Jas _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com