» »

[Visual C#] zaradi while zanke se ne pokaže okno

[Visual C#] zaradi while zanke se ne pokaže okno

c0dehunter ::

Imam eno okno, ki takoj po inicializaciji poklice metodo poslusaj(), ki posluša za povezave v while zanki. Problem je, ker se okno sploh ne prikaže. Če odstranim while zanko se prikaže, ampak potem pa ne posluša več.

Najboljše da kar prilepim kodo:
private void Form2_Load(object sender, EventArgs e)
        {
            poslusaj();
        }

        private void poslusaj()
        {
            tcpListener = new TcpListener(10100);
            tcpListener.Start();
            MessageBox.Show("Server: poslusam za povezavo...");
            try
            {
                while(true)  
                {
                    if (tcpListener.Pending())
                    {
                        socketForClient = tcpListener.AcceptSocket();
                        MessageBox.Show("Server: povezava sprejeta!");
                        if (socketForClient.Connected)
                        {
                            networkStream = new NetworkStream(socketForClient);
                            streamReader = new StreamReader(networkStream);
                            textBox1.Text = streamReader.ReadLine();
                        }
                        socketForClient.Close();
                    }
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
            } 
        }
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Trinitron ::

Bom probal odgovorit, čeprav bolj slabo poznam c#.

Pomoje se ti zacikla while zanka, ki verjetno nabije procesor do konca. Zato ne rabiš pogoja if, ker bo tcpListener.AcceptSocket() že sam po sebi počakal na povezavo.

Pa tudi pri vsakem MessageBox.Show se izvajanja programa zamrzne, dokler okna ne zapreš. Zato to ni najboljši način sporočanja, da računalnik čaka na povezave, ker bo v bistvu čakal šele ko dialog zapreš.

noraguta ::

najprej najbolj očitna napaka.
while(true) kdaj že tole drži?
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()

Trinitron ::

while(true) je v tem primeru čisto OK, ker server naj bi itak skos laufal, ane :P

Iluvatar ::

Dečki to se ne dela tak.
Za zapomnit si je tole zlato pravilo: NIKOLI NE ŠTARTAMO KAKIH VEČJIH OBDELAV, SPLOH TAKIH KI NEKAJ ČAKAJO V ISTI NITI KOT JE USER INTERFACE.
Problem z neprikazovanjem okna boš rešil tako, da boš metodo poslusaj štartal v svoji niti.
Po domače:
private void Form2_Load(object sender, EventArgs e)
        {
            Thread trd = new Thread(new ThreadStart(this.poslusaj));
            trd.IsBackground = true;
            trd.Start();

        }

        private void poslusaj()
        {
            tcpListener = new TcpListener(10100);
            tcpListener.Start();
            MessageBox.Show("Server: poslusam za povezavo...");
            try
            {
                while (true)
                {
                    if (tcpListener.Pending())
                    {
                        socketForClient = tcpListener.AcceptSocket();
                        MessageBox.Show("Server: povezava sprejeta!");
                        if (socketForClient.Connected)
                        {
                            networkStream = new NetworkStream(socketForClient);
                            streamReader = new StreamReader(networkStream);
                            textBox1.Text = streamReader.ReadLine();
                        }
                        socketForClient.Close();
                    }
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
            }
        }


    }

c0dehunter ::

Hvala, na threading se nisem spomnil... Namreč program je delal, dokler je blo v konzoli vse, ko pa je UI zravn pa ne pride do točke ko bi ga mel čas prikazat.
Hvala tudi ostalim!
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Spura ::

Tudi ce je v svojem threadu ne sme bit if (tcpListener.pending()), ker se bo vrtel v zanki kot nor.

noraguta ::

ne samo da nabija nevarna je! stvar bo celo do nekega števila klijentov delala potem pa bo , ali klecnila zaradi prevelikega števila odprtih soketov, ali se bodo v textboxu začeli pojavljati "random" rezultati nekaj iz ene niti + nekaj iz druge z kančkom tretje... in ja NIKOLI se ne pejte v .netu ali podobnih ekosistemih neskončnih zank. ker po tem ni potrebe. tam lahko nit zaspi preverimo koliko lincev je skonektanih na nas etc..
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()

Fresh-Grass ::

Jaz bi dal nit vsaj spat malo, da teče po intervalih. Pol pa dodaš še magari kaki števec, da se nit po določenem številu poskusov ustavi, GUI uporabniku sporoči, da ni našel povezave, nit pa medtem čaka, da jo bo uporabnik ponovno zagnal.

Za spanje uporabi Thread.Sleep(št. ms),
za ustavitev niti uporabi AutoResetEvent (.WaitOne() znotraj tvoje niti in .Set() znotraj GUI niti),
za posodobitev GUI-ja znotraj niti pa:

this.BeginInvoke(new WaitCallback((object o) =>
{

}), 0);
this je v tem primeru form. Finta je, da ima samo STAThread kontrolo nad GUI-jem, zato ne moreš spreminjat GUI-a znotraj tvoje niti drugače kot da ustvariš še dodatno nit (new WaitCallback).

AutoResetEvent pa deluje kot parkirna rampa, z .Set() (npr. klik na "Poskusi znova" gumb) jo odpreš, spusti eno nit skozi in se avtomatsko zapre. Z .WaitOne(), kar pa napišeš znotraj tvoje niti, pa tvoji niti sporočiš naj čaka, da se "rampa" odpre, preden nadaljuje.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

UserControl v Wrappanelu WPF

Oddelek: Programiranje
51066 (888) hurlimannxt
»

Socket Server

Oddelek: Programiranje
142358 (1551) fx
»

[C#] Delo z okni - urejanje osebe

Oddelek: Programiranje
8919 (791) darkolord
»

c# tiho tiskanje slik.

Oddelek: Programiranje
101836 (1507) OmegaM
»

[C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?

Oddelek: Programiranje
51181 (1047) Mitja Bonča

Več podobnih tem