Как приостановить и возобновить поток в моем приложении? - PullRequest
0 голосов
/ 21 декабря 2011

Я занимаюсь разработкой игры. Во время игры, если пользователь нажимает кнопку возврата устройства, мне нужно приостановить поток и отобразить окно с предупреждением, подтверждающее, действительно ли пользователь хочет выйти или нет. Если пользователь хочет выйтиэто просто выход из игры. Но проблема возникает, когда пользователь не хочет выходить. тогда я должен возобновить поток.но я не могу этого сделать .. ниже приведен мой фрагмент кода ..

             public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {

         MyGamePanel.thread.setRunning(false);
         AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("Exit Alert");
                        alertDialog.setMessage("Do you really want to exit the Game?");
            alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                 finish();
                 return;
            } }); 
            alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                  dialog.cancel();
                      MyGamePanel.thread.resume();
                      MyGamePanel.thread.setRunning(true);
                return;
            }}); 
             alertDialog.show();

         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

, а приведенный ниже - часть потока.

       @Override
public void run() {
    Canvas canvas;
    Log.d(TAG, "Starting game loop");

    while (running) {
        canvas = null;
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                // update game state 
                this.gamePanel.update();
                // render state to the screen
                // draws the canvas on the panel
                this.gamePanel.render(canvas);  


            }
        } finally {
            // in case of an exception the surface is not left in 
            // an inconsistent state
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }   // end finally
    }
}

update () и render - две функциинаписано в классе MyGamePanel.

Я пробовал много вещей, но ничего не работает .. Пожалуйста, помогите мне ...

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Обычно вы не хотите использовать resume и suspend, потому что они могут оставить поток в несогласованном состоянии. Лучший способ сделать то, что вы пытаетесь сделать, - это семафор:

  • Объявите где-нибудь логическое значение, которое позволит вам указать, если игра приостановлена:

    Boolean paused;
    
  • Отметьте это логическое значение в игровом цикле и дождитесь паузы:

    synchronized(paused) {
        while(paused) {
            wait();
        }
    }
    
  • Установить и сбросить приостановленное логическое значение из основного потока:

    public void setPaused(boolean wantToPause) {
        synchronized(paused) {
            paused = wantToPause;
            notify();
        }
    }
    

Это схематический код, который, например, не обрабатывает исключения, но вы поняли идею.

0 голосов
/ 18 сентября 2017

Я думаю, что ваша проблема в вашем MyGamePanel.thread.resume();.Попробуйте удалить этот код и посмотрите, что произойдет.

Если вы думаете, что thread.resume () - это функция, которая вам нужна для другой цели (которую вы можете удалить), покажите нам код функции thread.resume (), чтобы мы могли помочь вамисправить код функции возобновления.

0 голосов
/ 26 июля 2015

У меня та же проблема, но я нашел решение, просто замените этот код в потоке.

while (true) {
if(running){
Log.d("running", "true");
    canvas = null;
    try {
        canvas = this.surfaceHolder.lockCanvas();
        synchronized (surfaceHolder) {
            // update game state 
            this.gamePanel.update();
            // render state to the screen
            // draws the canvas on the panel
            this.gamePanel.render(canvas);  


        }
    } finally {
        // in case of an exception the surface is not left in 
        // an inconsistent state
        if (canvas != null) {
            surfaceHolder.unlockCanvasAndPost(canvas);
        }`enter code here`
    }   // end finally
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...