Forum » Programiranje » [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:
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.
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š.
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?
while(true) kdaj že tole drži?
Pust' ot pobyedy k pobyedye vyedyot!
Zgodovina sprememb…
- spremenilo: noraguta ()
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:
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!
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.
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.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | UserControl v Wrappanelu WPFOddelek: Programiranje | 1142 (964) | hurlimannxt |
» | Socket ServerOddelek: Programiranje | 2431 (1624) | fx |
» | [C#] Delo z okni - urejanje osebeOddelek: Programiranje | 984 (856) | darkolord |
» | c# tiho tiskanje slik.Oddelek: Programiranje | 1936 (1607) | OmegaM |
» | [C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?Oddelek: Programiranje | 1277 (1143) | Mitja Bonča |