Avatar billede tandpine Nybegynder
06. juni 2004 - 10:26 Der er 19 kommentarer og
1 løsning

messages imellem threads

Hejsa

det er lidt angående det spørgsmål jeg kom med i går (Liste med hashtable)

Nu er det sådan at jeg vil dele en "messages" mellem en thread der har sin egen klasse, og så funktionerne i min hovedklasse.

Hvordan får jeg gjort så begge kan tilgå den samme.

/tand
Avatar billede arne_v Ekspert
06. juni 2004 - 10:29 #1
Du sender en reference til de data der skal deles med over i constructoren
til thread klassen, constructoren gemmer den og så kan run metode bruge
den reference.

Og ved brug af:

synchronized(variabel) {
  ...
}

omkring kritiske kode sektioner undgår du samtidigheds problemer.
Avatar billede tandpine Nybegynder
06. juni 2004 - 10:51 #2
Har prøvet noget i den retning men ved ikke om det er helt rigtigt

class ClientListenThread extends Thread
{
    public Messages messages;
    public ClientListenThread(Socket socket, Messages msgs)
    {
        messages = msgs;  // her skulle messages så blive gemt
        this.socket = socket;
        try
        {
            socketIn= new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
        catch(IOException e)
        {
        }
    }

    public synchronized void run()
    {
        String input;
        try
        {
            while(true)
            {
                input = socketIn.readLine();        // Just take the input
                aMsg = aMsg.stringAsMessage(input);
                synchronized(messages) {
                    messages.putMessage(aMsg);
                }
            }
        }
        catch(IOException e)
        {
        }
    }
   

Når jeg så starter tråden gør jeg det med:
            receiveThread = new ClientListenThread(socket, messages);
            receiveThread.start();


I denne funktion der ligger i min "hovedklasse" skal jeg så bruge og slette lidt i de messages:
    public synchronized boolean getAMessage()
    {
        if(messages.size()>0)
        {
            aMsg = messages.getMessage(0);
            messages.removeElementAt(0);
            return true;
        }
        else
            return false;
    }

det er garanteret ikke det store der er galt.. bare mig der gør det forkert :/

/tand
Avatar billede arne_v Ekspert
06. juni 2004 - 11:16 #3
Den overordnede logik ser OK ud.

Du mangler at erklære nogle variable.

aMsg = aMsg.stringAsMessage(input); forstår jeg ikke

Og så skal synkroniseringen  muligvis "finjusteres"
Avatar billede tandpine Nybegynder
06. juni 2004 - 11:20 #4
Okay. variablerne er erklærede :) den aMsg = aMsg.stringAsMessage(input); er nok også lidt "dumt" lavet.. det er for at jeg kan sende en message gennem sockets. den burde så nok ikke lige have være lavet i Message classen :)
Avatar billede arne_v Ekspert
06. juni 2004 - 12:08 #5
Men prøv og se hvordan det virker.
Avatar billede tandpine Nybegynder
06. juni 2004 - 13:03 #6
hmm jeg får dem ikke overført.. hvis du lige vil se erklæringerne kommer de her:
her er de i "hovedklassen:
    static Messages messages;
    static Message aMsg;

og i threaden:
    public Messages messages;
    private Message aMsg;

der er garanteret noget der der er galt :) kan bare ikke lige helt overskue det
Avatar billede tandpine Nybegynder
06. juni 2004 - 16:34 #7
nåh du ved det åbenbart heller ikke ???
Avatar billede arne_v Ekspert
06. juni 2004 - 16:43 #8
Jeg har ikke engang forstået hvad fejlen er.
Avatar billede tandpine Nybegynder
06. juni 2004 - 17:56 #9
fejlen er at den messages jeg har i hovedklassen og den jeg har i tråden ikke er den samme.. åbenbart.. :(

Jeg har prøvet alt muligt nu.. men uden held
/tand
Avatar billede arne_v Ekspert
06. juni 2004 - 22:39 #10
Vi kommer næppe videre uden at se noget mere kode
Avatar billede tandpine Nybegynder
07. juni 2004 - 19:52 #11
Okay.. Skal smider lige koden her så:

public class ChatApplet extends java.applet.Applet{
    static String chatname;
    static long chatid;
    static String serverip;
    static Socket socket;
    static BufferedWriter socketOut;
    static ClientListenThread receiveThread;
    static Messages messages = new Messages();
    static Message aMsg;

   
    public boolean connect()
    {
        try
        {
            socket = new Socket(InetAddress.getByName(serverip),1000);
            socketOut = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
            receiveThread = new ClientListenThread(socket);
            receiveThread.start();
            return true;
        }
       
        catch(IOException e)
        {
            System.err.flush();
            return false;
        }
    }
   
    public int getMessageType()
    {
        return aMsg.getMessageType();
    }
   
    public String getMessageFrom()
    {
        return aMsg.getMessageFrom();
    }
   
    public long getMessageFromID()
    {
        return aMsg.getMessageFromID();
    }
   
    public String getMessageTo()
    {
        return aMsg.getMessageTo();
    }
   
    public long getMessageToID()
    {
        return aMsg.getMessageToID();
    }
   
    public String getMessageText()
    {
        return aMsg.getMessageText();
    }
   
   
    public static synchronized boolean getAMessage()
    {
        if(messages.size()>0)
        {
            aMsg = messages.getMessage(0);
            messages.removeElementAt(0);
            return true;
        }
        else
            return false;
    }
   
    public void sendMessage(int type, String to, long toID, String text)
    {
        Message message = new Message(type, chatname, chatid, to, toID, text);
        String str = message.messageAsString();
        send(str);
    }
       
    private void send(String msg)
    {
        try
        {
            socketOut.write(msg);
            socketOut.newLine();
            socketOut.flush();
        }
        catch(IOException e)
        {
            System.err.println("ERROR: Could not send data: " +e);
        }
    }
   
    public void init()
    {
        chatname = getParameter("chatname");
        chatid = Long.parseLong(getParameter("chatid"));
        serverip = getParameter("server");
   
    }

}


import java.io.*;
import java.net.*;

class ClientListenThread extends Thread
{
    private BufferedReader socketIn;
    private BufferedWriter socketOut;
   
    private Socket socket;   
    static Messages messages;
    private Message aMsg;

    public ClientListenThread(Socket socket)
    {
        this.socket = socket;
        try
        {
            socketIn= new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
        catch(IOException e)
        {
        }
    }
   

    public synchronized void run()
    {
        String input;
        try
        {
            while(true)
            {
                input = socketIn.readLine();        // Just take the input
//                System.out.println(input);
                aMsg = aMsg.stringAsMessage(input);
                messages.putMessage(aMsg);
            }
        }
        catch(IOException e)
        {
        }
    }
   
   
}
Avatar billede tandpine Nybegynder
07. juni 2004 - 19:58 #12
Min ClientListenThread lytter efter beskeder fra serveren og smider dem ind på messages. ChatApplet skal så hvergang getAMessage() kaldes, ta den første message i rækken og lægger den over i aMsg. derfra kan jeg så få de enkelte værdier over i min javascript kode som også hører til. Jeg ved at selve min ChatApplet virker, da jeg har prøvet selv at lægge messages på listen og så hive dem ud derfra.

Jeg har snart prøvet alle mulige kombinationer og kan ikke få det til at virke.. håber du forstår hvad jeg mener.
Mvh
/Tand
Avatar billede arne_v Ekspert
07. juni 2004 - 22:22 #13
Ja, men du sender jo ikke messages over i ClientListenThread constructor, så det
kan ikke overraske at du har to messages.
Avatar billede tandpine Nybegynder
07. juni 2004 - 22:29 #14
ooh.. sorry.. jow har prøvet med det også :(

receiveThread = new ClientListenThread(socket, messages);

og modtar den ovre i ClientListeThread:

public ClientListenThread(Socket socket, Messages messages)

mvh Tand
Avatar billede arne_v Ekspert
07. juni 2004 - 22:34 #15
Og ClientListenThread constructor har:

this.messages = messages;

?
Avatar billede tandpine Nybegynder
08. juni 2004 - 17:45 #16
ja nu har den.. virker stadig ikke... :(
Avatar billede tandpine Nybegynder
08. juni 2004 - 18:03 #17
nåh.. har fundet ud af det alligevel ikke var der fejlen var.. :)
undskyld besværet.. det er min socket connection der går galt et eller andet sted istedet :(
Avatar billede arne_v Ekspert
08. juni 2004 - 18:15 #18
Skal vi stoppe her eller skal vi også have det løst ?

Det sidste => vi skal have noget mere info
Avatar billede tandpine Nybegynder
08. juni 2004 - 18:40 #19
Jeg tror bare vi stopper her... :)hvis du vil ha dine point må er du velkommen :)
Avatar billede arne_v Ekspert
08. juni 2004 - 21:13 #20
jo tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester