2011-07-10 126 views
3

我正在嘗試啓動支持應用程序的列表。然後,我必須等到這些應用程序完成啓動後再繼續執行代碼。以下是我現在所擁有的:啓動外部應用程序並等待它們啓動

NSWorkspace *ws = [NSWorkspace sharedWorkspace]; 
int i = 0; 

while (i < [launchApps count]) { 
    [ws launcApplication: [launchApps objectAtIndex: i]]; 
    ++i 
} 

while (![self appsFinishedLaunching]) { 
    NSLog(@"loop"); 
    sleep(1); 
} 

再後來:

- (BOOL)appsFinishedLaunching 
{ 
    BOOL doneLaunching = NO; 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

      int i = 0; 
      while (i < [launchApps count]) { 
       NSWorkspace *nws = [NSWorkspace sharedWorkspace]; 
       NSArray *runningApps = [NSArray arrayWithArray:[nws runningApplications]]; 
       for (NSRunningApplication *app in runningApps) { 
        if ([[app localizedName] isEqualToString:[launchApps objectAtIndex:i]]) { 
         if ([app isFinishedLaunching]) { 
          [launchApps removeObjectAtIndex:i]; 
          break; 
         } 
        } 
       } 
       ++i; 
      } 
    if ([launchApps count] == 0) 
     doneLaunching = YES; 

    [pool drain]; 

    return doneLaunching; 
} 

如果我跑手動打開launchApps所有的應用程序我控制檯中看到一個「循環」,一切都很好。如果我運行此代碼並讓它啓動應用程序,它會進入無限循環。看起來我的共享工作區中的NSRunningApplications對象沒有被更新,我不知道爲什麼。我錯過了什麼?

+0

你正在爲他們「等待」或「吃東西」嗎?標題有點有趣。 – Blender

+0

錯別字,對不起!感謝克里斯的編輯:) – Kris

回答

1

Apple Docs on NSRunningApplication

@property(只讀,吸氣= isFinishedLaunching)BOOL finishedLaunching

此屬性的值對應於運行的應用程序接收到一個通知NSApplicationDidFinishLaunchingNotification內部。某些應用程序不會發布此通知(不依賴NSApplication的應用程序),因此從未報告爲完成啓動。

如果您啓動的應用程序未發佈通知,則不能使用此屬性。

問題是,您嘗試啓動Cocoa應用程序的應用程序?否則,您可能需要調查其他啓動功能; C函數exec可能工作,但我沒有看過它。

+0

是的,我正在測試與可可應用程序。如果應用程序在運行我的代碼之前啓動,那麼它確實可行,所以只要所有內容在第一次「isFinishedLaunching」循環運行之前完成啓動,它就會將其視爲已完成啓動。 – Kris

+0

嗯...好吧,你有沒有檢查過以確保'[app localizedName]'返回一個名字,它實際上等於你的任何'[launchApps objectAtIndex:i]'s?你可能想要放入一些'NSLog()來檢查這個,或者設置一些斷點並調試那個部分。 –

+0

是的,我只是放了一個NSLog()語句來測試'[app localizedName]''[launchApps objectAtIndex:i]'和'[app isFinishedLaunching]'如果這些應用程序是預先啓動的,一切都如預期般出來。如果代碼啓動應用程序,應用程序名稱仍然是相同的,但'[app isFinishedLaunching]'永遠不會更改爲'YES',它只會連續循環返回'NO'。 – Kris

相關問題