ukinjanje thread-a

Za vse novince v izdelovanju iger.

ukinjanje thread-a

OdgovorNapisal/-a newbe » Ne Sep 20, 2015 2:44 pm

Živjo!
Sem nov pri tehle zadevah (forumi, Android za telebane in par drugih knjig o Javi za Androida), pa poskušam za otroka napisati čisto preprosto igrico, kjer je potrebno deaktivirati odštevalnik še pred njegovim iztekom. To bi potem uporabil za druge elemente, ampak mi trenutno ne ratuje. Odštevalnik sem si zamislil poganjati v ločenem threadu, pa ko ga hočem ustaviti oz. resetirati ter ponovno zagnati, mi stari thread še vedno teče, novi pa se zažene dodatno preko njega. Če ima kdo kakšno idejo, kako se tem stvarem streže, bom zelo hvaležen za pomoč. Pišem pa v android Java.

Hvala

lp Rok

Spodaj je koda:
Koda: Izberi vse
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Reset extends Activity implements OnClickListener{

   TextView finalResult, result, counter;
   Button button1;
   Integer score;
   long timer, timeCounter;
   Thread countDown;
   private Handler handler = new Handler();
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.reset);
      initialize();
      result.setText("Your score is: " + score);
      }

   private void initialize() {
      score = 0;
      finalResult=(TextView) findViewById(R.id.tvFinalResult);
      result=(TextView) findViewById(R.id.tvResult);
      counter=(TextView) findViewById(R.id.tvCounter);
      //timer=100;
      button1=(Button) findViewById(R.id.bButton_1);
      button1.setOnClickListener(this);
   }
   
   public void countdown() {     
      // This method is called on the main GUI thread.
      countDown = new Thread(null, doBackgroundThreadProcessing);
      countDown.start();   
   }
                       
   // Runnable that executes the background processing method.
   public Runnable doBackgroundThreadProcessing = new Runnable() {
      public void run() {
         while(!countDown.isInterrupted()) {
            backgroundThreadProcessing ();
         }
         return;
      }
   };
   
   public void backgroundThreadProcessing() {
      // [ ... Time consuming operations ... ]
      
      int timeCounter = 0;
      timer = 100;
      
      while(timer > 0) {
          
          try {
            Thread.sleep(100);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
          
   if (countDown.isInterrupted()){
         //   handler.post(doUpdateGUIshowEndResult);
            return;
   }else
            timer = 100 - timeCounter;
            handler.post(doUpdateGUI);
            //printTimer();
            timeCounter ++;
          }
      showEndResult();
      }
   
   private Runnable doUpdateGUI = new Runnable() {
      public void run() {
         printTimer ();
      }
      };
      
   public void stopCountDown() {
       // Thread myThread;
      //Thread countDown = myThread;
       // myThread = null;
        if (countDown != null) {
           countDown.interrupt();
           }
      }
   
   
   private void printTimer() {
      
      if (timer>=0 && timer<=30){
         counter.setTextColor(Color.RED);
         counter.setText(" " + timer);
         }
      else
      {
         counter.setTextColor(Color.GREEN);
         counter.setText(" " + timer);
         }
      }
   
   
   private void showEndResult() {

         finalResult.setText("Your Final Result is: " + score);   
         try {
            Thread.sleep(5000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
         this.finish();
      }
   
   @Override
   public void onClick(View v) {
      
      score ++;
      result.setText("Your score is: " + score);
      
      stopCountDown();
      countdown();
   }

}

newbe
novinec
novinec
 
Prispevkov: 5
Pridružen: Ne Sep 20, 2015 2:28 pm

Re: ukinjanje thread-a

OdgovorNapisal/-a errorage » So Sep 26, 2015 11:50 pm

Najlažje rešiš tako, da med threadi komuniciraš s statičnimi spremenljivkami. Thread moreš zaključiti od znotraj threada, ne moreš ga kar thread.stop() od zunaj ali kaj takega. Tako lahko zunaj nastaviš neko statično spremenljivko na true, znotraj threada pa preveriš stanje spremenljivke: če je false izvajaš program, če je true končaš thread.

pseudokoda:
Koda: Izberi vse
Class Ext{

   public main(...){
      //Kreiraš thread iz razreda Thrd in ga zaženeš
      Data.stopThread = false;
      Thread t = new Thread(Thrd);
      t.start();
   }

   public StopThread{
      //Da thread ustaviš od zunaj samo nastaviš ta parameter na true. Thread se ustavi sam.
      Data.stopThread = true;
   }

}

Class Thrd{
   public run(){
      while(true){
         //Najprej preveriš če naj bi se thread ustavil
         if(Data.stopThread){
            //Če ja, potem ga ustavi
            return;
         }else{
            //Sicer storit to, kar naj bi thread počel
         }
      }
   }
}

Class Data{
   //V tem razredu samo hranimo to statično spremenljivko.
   public static bool stopThread = false;
}

errorage
novinec
novinec
 
Prispevkov: 16
Pridružen: Če Mar 10, 2011 2:43 pm

Re: ukinjanje thread-a

OdgovorNapisal/-a newbe » Ne Sep 27, 2015 8:41 pm

Hvala za odgovor!
Upam, da mi uspe čim prej preoblikovati kodo, pa sporočim uspešnost :-)

lp Rok
newbe
novinec
novinec
 
Prispevkov: 5
Pridružen: Ne Sep 20, 2015 2:28 pm

Re: ukinjanje thread-a

OdgovorNapisal/-a newbe » So Okt 03, 2015 8:52 am

Živjo!
Sedaj ko sem vnesel tole kodo, mi pa zajamra da Thrd ne more resolvat v spremenljivko (komentar 5. vrstici kode). Kaj je potrebno sedaj spremeniti?

lp Rok
Koda: Izberi vse
public class Ext{

         public void main(){
            //Kreiraš thread iz razreda Thrd in ga zaženeš
            Data.stopThread = false;
            Thread t = new Thread(Thrd); //Sedaj mi tukaj Thrd podčrta in napiše "Thrd cannot be resolved to a variable"
            t.start();
         }

         public void StopThread(){
            //Da thread ustaviš od zunaj samo nastaviš ta parameter na true. Thread se ustavi sam.
            Data.stopThread = true;
         }
      }

public class Thrd{
      public void run(){
         while(true){
            //Najprej preveriš če naj bi se thread ustavil
            if(Data.stopThread){
               //Če ja, potem ga ustavi
               return;
            }else{
               //Sicer storit to, kar naj bi thread počel
            }
         }
      }
   }

public static class Data{
      //V tem razredu samo hranimo to statično spremenljivko.
      public static boolean stopThread = false;
   }
newbe
novinec
novinec
 
Prispevkov: 5
Pridružen: Ne Sep 20, 2015 2:28 pm

Re: ukinjanje thread-a

OdgovorNapisal/-a errorage » Po Okt 05, 2015 9:36 pm

Koda, ki sem jo postal je bila zgolj pseudokoda za rašiti težavo ustavitve threada. V Javo moraš prevesti sam.

Za Thrd si poglej sledeče:
https://docs.oracle.com/javase/tutorial ... hread.html

To ti pokaže kako kreiraš nov thread in ga zaženeš - V tem primeru sta Thrd in Ext isti razred, ko to prirediš v svojo kodo boš moral v Thrd extendat Thread in implementirat Run metodo kot v linkanem primeru, v Run metodo vključiš kodo iz mojega primera, sam thread pa začneš v Ext razredu.

Thread torej začneš v Ext -> main() tako:
(new Thrd()).start();

public class Thrd{ ... }
bo moral extendat Thread, torej:
public class Thrd extends Thread{ ... }

in v Thrd moraš implementirat run metood:
public void run() { ... }

Ostalo je v mojem prejšnjem postu.
errorage
novinec
novinec
 
Prispevkov: 16
Pridružen: Če Mar 10, 2011 2:43 pm

Re: ukinjanje thread-a

OdgovorNapisal/-a newbe » Če Okt 08, 2015 9:14 pm

thx

upam, da mi uspe sprobat čez vikend

lp Rok
newbe
novinec
novinec
 
Prispevkov: 5
Pridružen: Ne Sep 20, 2015 2:28 pm

Re: ukinjanje thread-a

OdgovorNapisal/-a newbe » So Okt 17, 2015 10:24 pm

Živjo!

Zdaj sem ga uspel preoblikovati v predlagani smeri, pa mi zopet ne uspe ustaviti threada. Še vedno zaganja en thread čez drugega, brez da bi prvega ustavil.

A daš lahko tole v eclipse ali pa v android studio, pa mi poveš v čem je štos?

Hvala

lp Rok

xml:
Koda: Izberi vse
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvFinalResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Final result"
        android:textColor="@color/green"
        android:textSize="45dp"
        android:layout_gravity="center"
          android:gravity="center"
          android:textAppearance="?android:attr/textAppearanceLarge"/>

        <TextView
        android:id="@+id/tvResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result"
        android:textColor="@color/green"
        android:textSize="45dp"
        android:layout_gravity="center"
          android:gravity="center"
          android:textAppearance="?android:attr/textAppearanceLarge"/>
       
                <TextView
        android:id="@+id/tvCounter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Counter"
        android:textColor="@color/green"
        android:textSize="45dp"
        android:layout_gravity="center"
          android:gravity="center"
          android:textAppearance="?android:attr/textAppearanceLarge"/>
   
    <Button
        android:id="@+id/bButton_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="fill_vertical"
        android:text="Button1" />

</LinearLayout>


program:
Koda: Izberi vse
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Reset extends Activity implements OnClickListener{

   TextView finalResult, result, counter;
   Button button1;
   Integer score;
   long timer, timeCounter;
   Thread countDown;
   private Handler handler = new Handler();
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.reset);
      initialize();
      result.setText("Your score is: " + score);
      main();
      }

   private void initialize() {
      score = 0;
      finalResult=(TextView) findViewById(R.id.tvFinalResult);
      result=(TextView) findViewById(R.id.tvResult);
      counter=(TextView) findViewById(R.id.tvCounter);
      button1=(Button) findViewById(R.id.bButton_1);
      button1.setOnClickListener(this);
   }
   
         public void main(){
            //Kreiraš thread iz razreda Thrd in ga zaženeš
            Data.stopThread = false;
       //     Thread t = new Thread(Thrd); //Sedaj mi tukaj THRD podčrta in napiše "Thrd cannot be resolved to a variable"
       //     t.start();
                      new Thrd().start();
         }

         public void stopThread(){
            //Da thread ustaviš od zunaj samo nastaviš ta parameter na true. Thread se ustavi sam.
            Data.stopThread = true;
         }
      

public class Thrd extends Thread {
   
   public void run(){
         while(true){
            //Najprej preveriš če naj bi se thread ustavil
            if(Data.stopThread){
               //Če ja, potem ga ustavi
               return;
            }else{
               //Sicer storit to, kar naj bi thread počel
              
               int timeCounter = 0;
              timer = 100;
              
              while(timer > 0) {
                  
                  try {
                    Thread.sleep(100);
                 } catch (InterruptedException e) {
                    e.printStackTrace();
                 }
                  
                  if(Data.stopThread){
                      //Če ja, potem ga ustavi
                      return;
                   }else{
                 timer = 100 - timeCounter;
                 //printTimer();
            handler.post(doUpdateGUI);
            timeCounter ++;
                   }
          }
      showEndResult();
      }
     }
   }
}
        

public static class Data{
      //V tem razredu samo hranimo to statično spremenljivko.
      public static boolean stopThread = false;
   }

private Runnable doUpdateGUI = new Runnable() {
   public void run() {
      printTimer ();
   }
   };
   
private void printTimer() {
      
      if (timer>=0 && timer<=30){
         counter.setTextColor(Color.RED);
         counter.setText(" " + timer);
         }
      else
      {
         counter.setTextColor(Color.GREEN);
         counter.setText(" " + timer);
         }
      }
   
   
   private void showEndResult() {

         finalResult.setText("Your Final Result is: " + score);   
         try {
            Thread.sleep(5000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
         this.finish();
      }

@Override
   public void onClick(View v) {
      
      score ++;
      result.setText("Your score is: " + score);
      
      stopThread();
      main();
   }
}
newbe
novinec
novinec
 
Prispevkov: 5
Pridružen: Ne Sep 20, 2015 2:28 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron