Toon posts:

Applet stoppen - thread probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
hey,
het probleem is, wanneer ik de pagina verlaat (door surf) dan blijft de applet runnen. Ik ben dus van plan via een <body OnUnload=applet.stopit(); een functie in de applet te runnen die alles stopt. dat aanroepen werkt, maar het stoppen niet.

De applet hoeft overigens niet helemaal te stoppen. De Socket in de thread Thread3(localserver) moet sowieso dicht gaan. Je ziet in de code dat ik de fucntie stopthis() aanroep in de Thread3. Maar de compiler geeft aan dat de functie stopthis() dan static moet zijn. Dit wil ik niet, want dan kan ik de socket niet dichtgooien omdat die non-static is.

is er een andere manier om die socket te stoppen vanuit de functie stopit() ??

Mvg Jeffrey Krist


Myapplet.java
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
public class myapplet extends Applet
{

    public localserver init;
    public Thread thread3;

    public myapplet()
    {
    }

    public void stopit(){
try{
localserver.stopthis();
}catch(Exception ex) { 
System.out.print("woops"+ex);
}
    }

    public void init()
    {
        try
        {
            localserver localser = new localserver();
            localser.startlocalserver(s1a);
            thread3 = new Thread(localser);
            thread3.start();
        }
        catch(Exception _ex) { }
    }
}

localserver.java
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
class localserver extends Applet implements Runnable
{
  private String serv;
  private InputToOutput run;
  private Socket socket1, socket;

   public void startlocalserver(String s)
    {
   serv = s;
    }

    public localserver()
    {
    }
   

    public static void stopthis(){

    try{
    System.out.print("-stoping-");

    }catch(Exception _ex) {System.out.print("-error:-"); }
    }

    public void run()
    {
        try
        {

            ServerSocket serversocket = new ServerSocket(863);
            socket = serversocket.accept();
            Socket socket1 = new Socket(serv, 325);
            ...
            Thread thread = new Thread(inputtooutput);
            thread.start();
            Thread thread1 = new Thread(inputtooutputb);
            thread1.start();

        }
        catch(Exception _ex) { }
    }
}

Verwijderd

Je moet de instantie van de localserver class een member variabele van myapplet maken. Dat heb je al gedaan:
code:
1
public localserver init;

maar je gebruikt die vaiabele nog niet. Als je die nu localser noemt:
code:
1
public localserver localser;

Dan kan je in de init deze zo in de lucht helpen:
code:
1
localser = new localserver();

i.p.v.
code:
1
localserver localser = new localserver();


Vanuit stopit kan je nu gewoon localser.stopthis() aanroepen. Zal je in die functie wel iets meer dan System.out.print() moeten zetten natuurlijk!

Verwijderd

Topicstarter
thnx, ik heb dat gedaan. de functie stopthis() word idd aangeroepen.

functie stopthis()
Java:
1
2
3
4
5
6
7
public void stopit(){
    try{
    System.out.print("-close sockets-");
    socket.close();
    socket1.close();
    }catch(Exception ex) {System.out.print("-error: "+ex); }
    }


ik krijg nu de nullpointerexeption error. ik heb getest dat het aan de socket & socket1 ligt die ik probeer te sluiten. Waarom krijg ik die error, alles is goed als je mij vraagt..

Verwijderd

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void run() 
    { 
        try 
        { 

            ServerSocket serversocket = new ServerSocket(863); 
            socket = serversocket.accept(); 
            Socket socket1 = new Socket(serv, 325); 
            ... 
            Thread thread = new Thread(inputtooutput); 
            thread.start(); 
            Thread thread1 = new Thread(inputtooutputb); 
            thread1.start(); 

        } 
        catch(Exception _ex) { } 
    } 


Op regel 8 van dit block maak je een lokale variabele (in de scope van de method dus) van socket1. Je gebruikt dus niet de member variabele socket1. Deze is nog null als je um in stopthis probeert te sluiten.

Dus even 'Socket' aan het begin van die regel weghalen.

[ Voor 22% gewijzigd door Verwijderd op 23-11-2003 13:03 ]


Verwijderd

Topicstarter
oke, dat was het niet alleen.
ik heb ontdekt dat het door de blocking-call ServerSocket.accept gaat. wanneer er is geconnect sluit hij de sockets wel, en geeft geen error. wanneer er nog niet is geconnect geeft hij de error.

Wanneer ik weer op de pagina terug kom zonder de browser te hebben gesloten krijg ik in de javaconsole deze error:

java.lang.LinkageError: Class already defined in the context of this loader: ...

logisch, omdat de applet nog runt. hoe kan ik de threads b.v. stoppen, ik denk dat daarna de hele applet stopt.

[ Voor 40% gewijzigd door Verwijderd op 23-11-2003 17:02 ]