2010-12-06 9 views
0

私は同時に2つのスレッドを実行する必要がありますが、私はそうする方法を得ていません。対物レンズCで2つのマルチスレッドを同時に実行するには?

私はスレッドを開始:

[NSThread detachNewThreadSelector:@selector(MyNewThread:) toTarget:[CMyClass class] withObject:nil];  

-(void)MyNewThread:(id)param{ 
    NSAutoreleasePool *Pool = [[NSAutoreleasePool alloc] init]; 
    NSString *strSwitcher = @"myCommand"; 

    const char * cstrSwitcher = [strSwitcher UTF8String]; 
    system(cstrSwitcher); 
    [Pool release]; 
} 

や他のいくつかのシステムコマンド、私は他のスレッドに送りたいです。 1つのシステムコマンドプロンプトの変更を送信すると(たとえば、myCommand>)。

ここで別のスレッドを開始すると、そのコマンドは以前のスレッドが停止したときにのみ機能します。

誰でも私を助けることができますか?

+0

申し訳ありませんが、私はこれについて言及しませんでした。私はすでに2つのスレッドを同時に実行しています。しかし、異なるスレッドで異なるシステムコマンドを書きます。 –

+0

1つのスレッドを実行すると、前のスレッドを停止するまで別のスレッドが機能しませんでした。 –

+0

一度に複数のスレッドをどのくらい正確に実行しようとしているかを示すコードを投稿してください。 –

答えて

0

OPでのあなたのコメントの情報を考慮に入れて、system()を複数のスレッドから同時に呼びたいと思っています。

残念ながら、system()に電話すると、アプリケーションは子プロセスが終了するとすぐに送信される信号を待つので、うまくいきません。信号はアプリケーションのスレッドに関する情報を知らないため、system()は複数のスレッドから同時に実行することはできません。

JeremyPがコメントのNSTaskの方向を指してくれてありがとう!

代わりに、NSTaskを使用します。

NSTaskは、子プロセスで子プロセスを作成するためにfork()を使用して、親にwaitpid()を呼び出し、execve()(またはその兄弟の1)。 <sys/wait.h>で定義されているマクロを使用すると、子の戻り値は終了後に取得されます。このようにして、他のスレッドをブロックせずに複数の子プロセスを起動することができます。あなた自身でやってもいいし、単純なNSTaskクラスを使ってもかまいません。

+0

はい私はまさにこの問題に直面しています。 –

+0

私はちょうど 'execve()'を私のポストで使うことについてもう少し詳しく述べました。私の答えが役に立ったら、それを受け入れてください。 –

+0

Cocoaでfork/exec /を使用するのではなく、NSTaskを使用してください。 – JeremyP

0

ハンガリーの表記法を使用しないことをお勧めします(WindowsはWin32で取り上げましたが、.NETで削除しました)。 'Pool'を 'pool'に、 'strSwitcher'を 'switcher'にそれぞれ変更します。さて、単にシステム([switcher UTF8String])を呼び出してください。その余分な変数の代わりに。さらに、NSAutoreleasePoolを削除し、新しい@autoreleasepool {}定義を使用してコードを囲みます。それは今見える方法です。見つけるために(私もこの方法を少し変更しました。)

- (void)executeTaskAtPath:(NSString *)path withArguments:(NSArray *)arguments { 
    @autoreleasepool { 
     NSTask *task = [launchedTaskWithLaunchPath:path arguments:arguments]; 
     [task waitUntilExit]; // This blocks the thread. 
    } 
} 

- (void)myNewThread:(id)param { 
    @autoreleasepool { 
     NSString *switcher = @"myCommand"; 
     system([switcher UTF8String]); 
    } 
} 

そして、あなたは複数の実行可能ファイルを実行できるようにするNSTasksに切り替えしたい場合は、ここではそれがどのようになるのですタスクが正常に終了した場合は、[NSNotificationCenter defaultCenter]にNSTaskDidTerminateNotificationを登録します。

+0

うわー、私は古いポストを掘りましたか?私の悪い。 –

+0

iOSで 'NSTask'を使うことはできますか? – Exploring

関連する問題