Avatar billede jess_chr Nybegynder
15. september 2005 - 19:05 Der er 6 kommentarer og
1 løsning

Problem medThreading Vs. CPU Usage / Netværks Applikation

Hej alle sammen...

Jeg har et problem, jeg sidder og skriver et program der lytter på netværket, Ideen er at den modtager en streng, hvorefter den kører en funktion der returnerer noget tilsvarende data fra et array... Hvad den gør er egentlig ikke så vigtigt, problemet er at jeg kører den fra en Windows Applikation som en "Thread".

Dette får uheldigvis den selv samme netværks applikation til at bruge 50% CPU kraft(CPU temperaturen stiger omkring 14 grader), dette er ikke så godt, dog skal det siges at programmet virker som det er nu, så der skal helst ikke så store ændringer i det. Hvis der er nogen der genkender koden i ListenerMain er det nok rigtig nok, det er noget jeg har snuppet fra et konsol program jeg lavede engang som en del af en øvelse, kan dog ikke huske hvor.

en af mine egne ideer var at lave noget kode der udfører en "Suspend()" på ListenerMain når der ikke var noget trafik til den, men den eneste måde jeg selv kender til at gøre dette er at lave en ny tråd der gør det for mig, og den kommer også til at anvende 50% CPU kraft.

Er der nogen der har en god ide?

Forhånd tak...

<copy paste af koden>

public void ListenerMain(){
            listen = true;

            IPHostEntry Iphe = null;
            IPEndPoint Ipep = null;
            Socket Server = null;

            Iphe = Dns.Resolve(Dns.GetHostName());
            Ipep = new IPEndPoint(Iphe.AddressList[0], 4444);
            Server = new Socket(Ipep.Address.AddressFamily,SocketType.Stream,ProtocolType.Tcp);

            ArrayList Client = new ArrayList();
            string rln = null;

            Client.Capacity = 256;
            Server.Blocking = false;
           
            Server.Bind(Ipep);
            Server.Listen(32);               

            while(listen){
                if(Server.Poll(0, SelectMode.SelectRead)){
                    int i = Client.Add(new TcpSock());
                    ((TcpSock)Client[i]).tcpSock = Server.Accept();
                    ((TcpSock)Client[i]).SendLn("Connected");
                }

                for(int i = 0; i < Client.Count; i++){
                    if (((TcpSock)Client[i]).tcpSock.Poll(0, SelectMode.SelectRead)){
                        if(((TcpSock)Client[i]).Recv(ref rln) > 0)
                        {
                            if(rln == "\r\n")
                            {
                                ((TcpSock)Client[i]).RecvLn(ref rln);
                                ((TcpSock)Client[i]).Send(DoQuery(i.ToString() + ": " + rln));
                            }
                        }
                        else{
                        ((TcpSock)Client[i]).tcpSock.Shutdown(SocketShutdown.Both);
                        ((TcpSock)Client[i]).tcpSock.Close();
                            Client.RemoveAt(i);
                        }
                    }   
                }
            }
            funktion_end = true;
        }
    }

    public class TcpSock{
   
        int tcpIndx = 0;
        int tcpByte = 0;
        byte[] tcpRecv = new byte[1024];
        public Socket tcpSock;

        public int Recv(ref string tcpRead)
        {
            tcpByte = tcpSock.Available;
            if(tcpByte > tcpRecv.Length - tcpIndx)
                tcpByte = tcpRecv.Length - tcpIndx;

            tcpByte = tcpSock.Receive(tcpRecv,tcpIndx,tcpByte,SocketFlags.Partial);
            tcpRead = Encoding.ASCII.GetString(tcpRecv,tcpIndx,tcpByte);
            tcpIndx+= tcpByte;
           
            return tcpRead.Length;
        }

        public int RecvLn(ref string tcpRead)
        {
            tcpRead = Encoding.ASCII.GetString(tcpRecv,0,tcpIndx);
            tcpIndx = 0;
            return tcpRead.Length;
        }

        public int Send(string tcpWrite)
        {
            return tcpSock.Send(Encoding.ASCII.GetBytes(tcpWrite));
        }

        public int SendLn(string tcpWrite)
        {
            return tcpSock.Send(Encoding.ASCII.GetBytes(tcpWrite + "\r\n"));
        }
    }
}
Avatar billede nielle Nybegynder
15. september 2005 - 19:09 #1
Hvorfor ligger du ikke bare en Thread.Sleep(100) ind i din listener-loop. Det burde hjælpe gevaldigt.
Avatar billede jess_chr Nybegynder
15. september 2005 - 19:10 #2
hvor ville du foreslå at ligge den? hver gang den kører løkken?
Avatar billede nielle Nybegynder
15. september 2005 - 19:15 #3
Nemlig, ja:

while(listen){
    if(Server.Poll(0, SelectMode.SelectRead)){
        int i = Client.Add(new TcpSock());
        ((TcpSock)Client[i]).tcpSock = Server.Accept();
        ((TcpSock)Client[i]).SendLn("Connected");
    }

    for(int i = 0; i < Client.Count; i++){
        if (((TcpSock)Client[i]).tcpSock.Poll(0, SelectMode.SelectRead)){
            if(((TcpSock)Client[i]).Recv(ref rln) > 0)
            {
                if(rln == "\r\n")
                {
                    ((TcpSock)Client[i]).RecvLn(ref rln);
                    ((TcpSock)Client[i]).Send(DoQuery(i.ToString() + ": " + rln));
                }
            }
            else{
                ((TcpSock)Client[i]).tcpSock.Shutdown(SocketShutdown.Both);
                ((TcpSock)Client[i]).tcpSock.Close();
                Client.RemoveAt(i);
            }
        }
    }

    Thread.Sleep(100);
}
Avatar billede jess_chr Nybegynder
15. september 2005 - 19:15 #4
det er lidt pinligt, jeg er helt sikker på at jeg afprøvede det engang, hvor det ikke virkede...

Jeg forkortede den til 50 Thread.Sleep(50), og det virkede...

ny rekord, problem løst på 7 minutter.

Smid et svar og pointene er dine!
Avatar billede nielle Nybegynder
15. september 2005 - 19:19 #5
Du behøver ikke at give mig alle 150 point - så forfærdilig svær var opgaven nu heller ikke - læg du bare selv et svar og tag så de fleste point tilbage igen. :^)

... og et svar :^)
Avatar billede jess_chr Nybegynder
15. september 2005 - 19:22 #6
det er okay... det er ikke første gang jeg har haft det problem, men du er den første der er kommet med et svar der virker...

Mange tusind tak...

Mvh Jess
Avatar billede nielle Nybegynder
15. september 2005 - 19:23 #7
Jamen så sir' jeg mange tak for point :^)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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