Toon posts:

[J2ME] probleem met thread

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met een applicatie waar ik seriele data binnenhaal, en aan de hand daarvan een bepaalde functie aanroep. Als ik bv dat " 01 " binnenkrijg ga ik naar een case waar ik een desbetreffende functie aanroep.

Maar nu werk ik ook met een thread die constant aan het runnen is. Als ik een stukje seriele data binnenkrijg, bv " 02 " zet ik een waarde op true, waarbij dan in die thread een stukje code in uitvoering komt.

Maar nu wil ik in die thread terug een functie aanroepen uit m'n vorige klasse, waar ook de seriele data binnenkomt .. maar daarbij krijg ik constant een nullpointer exception :s

eventjes toelichten.

2 bestanden :
- Serial.java
- Sw_download.java

Serial.java, waar de seriele data binnenkomt, alsook de functie die ik in een andere thread wil aanroepen

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package application;

import java.io.*;
import java.util.*;
import javax.microedition.*;
import java.lang.*;
import javax.microedition.midlet.*;
import com.siemens.icm.io.*;


public class Serial extends Thread {
        Main main;
        Sw_download sw_download;
    ATCommand atcommand;
        CommConnection  commConn;
        InputStream     inStream;
        OutputStream    outStream;
        HttpConnection connection;
        public static boolean running_download;


      
// -----------------------------------
// Download software
// -----------------------------------    
    public void request_update_selected_item() throws IOException{

    // DE DESTBETREFFENDE FUNCTIE
    }

    

// -----------------------------------
// Running Download
// -----------------------------------  
    public static boolean runningDownload() {
        return running_download;
    } 
    
    
// ---------------------------------
// Constructor
// ---------------------------------     
    public Serial(Main main) {
        super();
        this.main = main;                
    }

    
// --------------------------------
// Uitvoering programma
// --------------------------------
    public void run () {
        try {
            while (Main.isWorking()) { 
               int voor_nr = (inStream.read() | (inStream.read() << 8));
               switch (voor_nr){
                case 0x3034: // Request update selected item
                    System.out.println("Request update selected item");
                    running_download = true;
                   // HIERDOOR WORDT DE THREAD UITGEVOERD
                break;
                }
             }
        } 
        catch(IOException e) {
            System.out.println(e);
        }
        try {
            main.destroyApp(true);    
        }
        catch (MIDletStateChangeException ex) {
            ex.printStackTrace();
        }   
    }
}


sw_download.java, waar m'n thread in werking treed als het specifieke stukje seriele data binnenkomt

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package application;

import java.io.*;
import java.util.*;
import javax.microedition.*;
import java.lang.*;
import javax.microedition.midlet.*;
import com.siemens.icm.io.*;


public class Sw_download extends Thread {
        Main main;
        Serial serial;

    public Sw_download() {

    }

        public void run() {

            while (Main.isWorking()) {  
                while (Serial.runningDownload()) {  
                    try {
                       serial.request_update_selected_item();
                   }
           catch (IOException ex) {
                       ex.printStackTrace();
                   }
                }
            }
        }
}


Hoe kan ik dus in m'n thread een functie in m'n klasse "Serieel" aanroepen,

Alvast bedankt!!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik neem aan dat je de nullpointerexception krijgt bij serial.request_update_selected_item.

Als jij serial veld geen invulling geeft, dan staat daar null en krijg je een null pointer fout. Je zult deze waarde dus moeten zetten.

Kijk verder eens naar de while(Main.isWorking()) loop zijn inhoud. Wat gebeurt er als serial.runningDownload false is? Dus wat gaat de processor doen op het moment dat while(Serial.runningDownload()) false is?

[ Voor 4% gewijzigd door Alarmnummer op 16-01-2007 13:32 ]


Verwijderd

Topicstarter
Alarmnummer schreef op dinsdag 16 januari 2007 @ 13:09:
Ik neem aan dat je de nullpointerexception krijgt bij serial.request_update_selected_item.

Als jij serial veld geen invulling geeft, dan staat daar null en krijg je een null pointer fout. Je zult deze waarde dus moeten zetten.

Kijk verder eens naar de while(Main.isWorking()) loop zijn inhoud. Wat gebeurt er als serial.runningDownload false is? Dus wat gaat de processor doen op het moment dat while(Serial.runningDownload()) false is?
Bedankt voor de uitleg Alarmnummer.
Wat bedoel je juist met de waarde die ik moet zetten?

Als de serial.runningDownload false is zal ie constant die thread doorlopen .. dus de processor zal volledig belast zijn op dat moment denk ik ..

nu ik heb ik anders opgelost, maar nu zit met een probleem dat ik met heel veel verlies van seriele dat zit .. precies of de processor heeft geen tijd voor de verwerking ..

Zijn er andere mogelijkheden om mijn probleem op te lossen?

dit is wat ik nu heb gedaan. De thread lokaal in serieel.java aanmaken

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// --------------------------------
// Uitvoering programma
// --------------------------------
    public void run () {
        try {
            while (Main.isWorking()) { 
               int voor_nr = (inStream.read() | (inStream.read() << 8));
               switch (voor_nr){
                case 0x3034: // Request update selected item
                    System.out.println("Request update selected item");
                    running_download = true;
                      
                    new Thread(new Runnable() {
                           public void run() {
                               try {
                                    request_update_selected_item();
                                }
                                catch (IOException ex) {
                                    ex.printStackTrace();
                                }                                               
                            }
                   }).start();  
        
        
                break;
                }
             }
        } 
        catch(IOException e) {
            System.out.println(e);
        }
        try {
            main.destroyApp(true);    
        }
        catch (MIDletStateChangeException ex) {
            ex.printStackTrace();
        }   
    }

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op dinsdag 16 januari 2007 @ 13:42:
[...]
Bedankt voor de uitleg Alarmnummer.
Wat bedoel je juist met de waarde die ik moet zetten?
Dat je wel een waarde in die variable moet plaatsen, anders krijg je een nullpointer exception.
Als de serial.runningDownload false is zal ie constant die thread doorlopen .. dus de processor zal volledig belast zijn op dat moment denk ik ..
Helemaal correct. Dit heet ook wel een busy wait en heeft als gevolg dat je cpu helemaal belast is (en dat heeft oa gevolgen voor het energie verbruik).

De oplossing is het werken met condition variables. Dit is een soort event systeem tussen threads. Java heeft hier support voor in de vorm van notify/notifyAll en wait (zie Object). Maar sinds Java 5 heeft java ook support hiervoor in de vorm van java.util.concurrent.Condition.

Maar mijn ervaring is dat het beter is om een hogere concurrency bouwsteen te gebruiken ipv zelf met dit soort events te gaan spelen.

In jouw geval heb ik niet direct een duidelijk antwoord. Ik heb even naar je code gekeken en het is me niet helemaal duidelijk geworden wat de bedoeling is. Ik snap niet helemaal waarom je 2 threads nodig zou bent.

Als je 2 threads data wilt laten uitwisselen zou ik eens kijken naar een Producer/Consumer design pattern en de java.util.concurrent.BlockingQueue om ze met elkaar te laten communiceren (alhoewel ik niet denk dat die op het jme platform te vinden is).

vb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Producer extends Thread{
void run(){
   while(true){
       Object data = inputStream.read();
      queue.put(data);
  }
}
}


class Consumer extends Thread{
  void run(){
      while(true){
            Object data = queue.take();
            process nu de data.
      }
  }
}


En die queue is dan een object dat tussen de Consumer en Producer gedeeld wordt.

De queue heeft zelf al een ingebouwd event systeem, dus je hoeft zelf niet meer te kloten met dit soort low level concurrency constructies.
nu ik heb ik anders opgelost, maar nu zit met een probleem dat ik met heel veel verlies van seriele dat zit .. precies of de processor heeft geen tijd voor de verwerking ..
Met een (blocking)queue heb je daar dus geen last meer van. Als een producer sneller kan producen dan een consumer kan consumer, dan blijft dit gewoon in de queue staan.

[ Voor 3% gewijzigd door Alarmnummer op 16-01-2007 17:41 ]