1

メインの開始スレッドでは、コードを一時停止して新しいスレッドを開始し、ユーザーの入力が得られるまで待機する必要があります。次に、作成された新しいスレッドを破棄して、メイン スレッドが中断したところに戻りたいと思います。しかし、何が起こっているかというと、新しいスレッドが呼び出されますが、メイン スレッドはコードを処理し続けます。ユーザーがインターフェイス ボタンを使用するのを妨げずに、これを処理するにはどうすればよいですか? if(moveCount == 2) ステートメントで別の nscondition を作成する必要があるのではないでしょうか? または、メイン スレッドが、ユーザー入力を通知する他のスレッドからのシグナルを受信するまで待機する必要があること。

追加の注意: また、インターフェイスで 2 つの UIButton を引き続き使用できるように、元のスレッドを一時停止したいと思います。

IM に寄せられた質問に関するその他の注意事項: これは私が作成しているゲームです。コードのどこかで、私のメソッドの 1 つのメイン スレッドを意味します。このメソッドは、移動している方向を決定し、タグ差を取得してから攻撃を行います。ただし、2 つの攻撃が行われる場合があるため、この時点で、ユーザーは画面上で 2 つのボタンをクリックして、どちらの攻撃を行うかを決定できます。

また、メインスレッドを今すぐ一時停止するべきではないことも静かに明らかです。もしそうなら、代替手段は何ですか?ありがとう

NSCondition と NSThread

@property (strong, nonatomic) NSCondition *condition;
@property (strong, nonatomic) NSThread *aThread;

私のviewDidLoadで以下を作成します。

// create the NSCondition instance
self.condition = [[NSCondition alloc]init];

// create the thread
self.aThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoop) object:nil];

どこか中間コード..

if(moveCount == 2){

        [self.aThread start];
    }

   // I need to get captureDecision from user from 2 buttons before continue.. How do I pause this thread when aThread is started. Then when capture decision is received discard aThread and start here.

    NSLog(@"Capture Decision = %d", captureDecision);
    if(captureDecision == 1){

        tagDifference = newButton.tag - currentButton.tag;

    }else{

        tagDifference = currentButton.tag - newButton.tag;

    }
}

aThread メソッド

-(void)threadLoop{

    NSLog(@"Thread Loop Triggered");
    while([[NSThread currentThread] isCancelled] == NO)
    {
        [self.condition lock];
        while(captureDecision == 0)
        {
            [self.condition wait];
        }

        [self.condition unlock];
    }
    [NSThread exit]; //exit this thread when user input is received
}
4

2 に答える 2

5

あなたが要求していることは不可能です.メインスレッドはユーザーの対話を処理するものです.メインスレッドを「停止」すると、インターフェイスが応答しなくなります.

アップルのドキュメントに基づく:

アプリのメイン実行ループは、すべてのユーザー関連イベントの処理を担当します。UIApplication オブジェクトは、起動時にメインの実行ループを設定し、それを使用してイベントを処理し、ビューベースのインターフェイスの更新を処理します。名前が示すように、メインの実行ループはアプリのメイン スレッドで実行されます。この動作により、ユーザー関連のイベントは、受信した順序で順次処理されます。

つまり、メインスレッドを停止すると、停止できなくなります。 https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW14

(バックグラウンド スレッドにユーザー インタラクションを処理させる奇妙な方法がない限り、私は気付いていないかもしれませんが、それでもかなり奇妙です)

他の人がここであなたに言ったように、あなたのアプローチは最適とはほど遠いものです。自問しなければならない質問は、コードのどの部分で特定のイベントが発生するのを待ちたいのか、またどのような目的で待機するのかということです。

達成したいことについてより詳細な説明をいただければ、より良い解決策を提供できます。

編集:

どんなゲームですか?ターンベース?タイマーのように絶えず描かれるもの。基本的に関数を使用する必要があります。たとえば、カード ゲームの場合は、すべてのカードを配置してユーザー入力を待ちます。ユーザーがボタンを押すと、「結果関数の計算」を実行し、適切な変更を行います。ボードして次の入力を待ちます。

スレッドを一時停止したい場合は、何かが常に実行されているためだと思います。CADisplayLink という画面と同期する特別なタイマーがあります。

https://developer.apple.com/LIBRARY/IOS/documentation/QuartzCore/Reference/CADisplayLink_ClassRef/Reference/Reference.html

このタイマーを「一時停止」して、ユーザーからの入力を待つこともできます。

ところで、イベントが発生するまでユーザーがインターフェイスとやり取りできるようにしたくない場合は、self.view.userInteractionEnabled = NO; これにより、「YES」に戻すまで、画面上のすべての対話が無効になります。

編集2:

フローを変更する方法は、ゲームの作成に使用しているもの、OpenGL によって異なりますか? Quartz2D? 単純なビュー?

少し道に迷ったような気がします。ここから始めてみてください。

http://www.raywenderlich.com/tutorials (ゲームの作成部分までスクロールします)

于 2013-12-05T00:57:49.123 に答える
-1

あなたはこれについて間違っているようです。設計上、メイン スレッドはブロックされません。タグの決定を設定するには、バックグラウンド スレッドからメイン スレッドへのある種のコールバック/デリゲートを使用する必要があります。もう少し情報/例を提供したいと思いますが、何を達成しようとしているのか、または「コードのどこか」セクションがどこで行われているのか、よくわかりません。私はメイン スレッドを考えましたが、メイン スレッドで実行されるセレクターを呼び出します。

于 2013-12-04T23:55:49.450 に答える