• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: interactive command line apps
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: interactive command line apps


  • Subject: Re: interactive command line apps
  • From: Sherm Pendley <email@hidden>
  • Date: Tue, 27 Sep 2005 16:31:59 -0400

On Sep 27, 2005, at 12:04 AM, Andrew Bush wrote:

is there some standard way to write a cocoa cli app that can be run, and then accepts input via stdin, acts on it, and accepts further input and so on?

or is it just as simple as putting a 'while 1' loop around the call to stdin?

oh...I also need to have sockets doing stuff in the background of this same app, if its just a while loop, do I need to make any special calls to ensure that all the background tasks are doing their stuff?

NSRunLoop is in Foundation, so it shouldn't require a connection to a window server, but I haven't verified that.


If you use an NSRunLoop, you could use the built-in *inBackground methods in NSFileHandle. You could do the same thing by creating and managing your own background threads, but that's more work.

Here's an example of how I'd approach it. In main.m:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Create the input handler
    InputHandler *ih = [[[InputHandler alloc] init] autorelease];

    while (![ih isFinished]) {
        // Kick the run loop
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate distantFuture]];
    }

    [pool release];
    return 0;
}

The InputHandler class looks like this:

@implementation InputHandler

- (id) init {
if ((self = [super init])) {
// Read from stdin
NSFileHandle *inHandle = [NSFileHandle fileHandleWithStandardInput];


// Listen for incoming data notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector (stdinDataAvailable)
name:NSFileHandleDataAvailableNotification
object:inHandle];


        [inHandle waitForDataInBackgroundAndNotify];
    }

    return self;
}

- (BOOL) isFinished {
    return finished;
}

- (void) stdinDataAvailable {
NSFileHandle *inHandle = [NSFileHandle fileHandleWithStandardInput];
NSData *theData = [inHandle availableData];


    if ([theData length] == 0) {
        finished = YES;
        return;
    }

    NSLog(@"Got data: %@", theData);

    // Listen for more
    [inHandle waitForDataInBackgroundAndNotify];
}

sherm--

Cocoa programming in Perl: http://camelbones.sourceforge.net
Hire me! My resume: http://www.dot-app.org

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: interactive command line apps
      • From: Andrew Bush <email@hidden>
References: 
 >interactive command line apps (From: Andrew Bush <email@hidden>)

  • Prev by Date: Re: sync quicktime playback over multiple computers
  • Next by Date: Re: Finding applications that link to framework
  • Previous by thread: interactive command line apps
  • Next by thread: Re: interactive command line apps
  • Index(es):
    • Date
    • Thread