2011-04-21 28 views
0

另一個應用程序我有一個運行使用控制與可可

NSString *systemRun = [[NSString alloc] init]; 
systemRun = [systemRun stringByAppendingFormat:@"open -a Terminal %@", executable]; 
system([systemRun UTF8String]); 

現在,我希望把我的GUI「結束」按鈕,即會關閉終端在終端中的二進制可執行文件的應用程序。但是,在我可以使用NSRunningApplication來終止它之前,我需要使終端會話註銷,以便它不會提示用戶提示登錄過程仍在運行。我認爲只是讓窗口類型「註銷」和返回字符最簡單。我知道我可以用AppleScript做到這一點,但AppleScript可以做一些Cocoa無法做到的事情似乎很奇怪。我錯過了什麼嗎?

+0

與此同時,使用'forceTerminate'方法而不是'terminate'可以正常工作,但是如何做到這一點的一般性答案仍然非常值得讚賞,對我的其他應用程序非常有用。 – Andrew 2011-04-21 20:38:56

+0

** GO!** 您應該認爲自己是您計算機的上帝。不幸的是,惡意的人用酒吧包圍了我們。 AppleScript不會將Objective-C消息發送到接收程序。它發送接收者同意解釋和執行的事件。 調試器和名爲「儀器」的程序證明這樣的事情可以完成。我傾向於認爲接收程序必須在調用者的堆內執行。同時運行的程序的多個副本從來沒有蘋果的方式。誰擁有我的電腦? – carmin 2013-02-25 04:24:10

回答

2

STOP!

您應該從來沒有告訴另一個應用程序退出,如果用戶可能已經在您的程序使用該應用程序的上下文之外使用它。

如果你的用戶已經有一個終端窗口打開並做了一些事情,那麼當它試圖終止Terminal.app時,你的程序會干擾它。如果用戶將Terminal.app配置爲在關閉僅運行登錄過程和shell的會話之前不提示,則最終將在沒有警告的情況下終止所有用戶的ssh會話。

(你怎麼想它,如果你的字處理器告訴您的Web瀏覽器來顯示網頁,然後殺了你的所有瀏覽器會話,當你關閉一個頁面?)

最起碼,使用open -n -W -a,但是如果可能的話,根本不要使用Terminal,只需將可執行文件的stdout傳送給NSTextView。如果您的可執行文件需要與用戶交互,請考慮使用一個xterm進程,當您的進程結束時它將自行終止。

+0

啊,xterm是個好主意。不幸的是,我製作了這個令人敬畏的GUI包裝器來運行可執行文件,但我不得不去掉這個想法,因爲偶爾出現了一些緩衝和編碼問題。感謝您的建議 – Andrew 2011-04-21 21:16:34

0

GO!

你應該認爲自己是你電腦的上帝。不幸的是,惡意的人用酒吧包圍了我們。 AppleScript不會將Objective-C消息發送到接收程序。它發送接收者同意解釋和執行的事件。

請參閱使用NSDistantObject,NISInvocation,NSConnection,NSPortMessage,NSPort的OSX分佈式對象體系結構將消息從客戶機進程傳輸到服務器進程。我還沒有穿過這條路。

請參閱Distributed Objects手冊。