[ xxxrugby @ 29.01.2008. 20:55 ] @
Bok.
Imam napravljen programicic koj mi pinga neke od servera te se preko TCP-a konektira na odredjene portove.
To je ovako samo za provjeru dali je port dostupan da radi.

Uglavnom dok se to sve vrti to traje neko vrijeme jedno 15-ak sekundi. Sve to vrijeme je ono forma zablesavljena ne moze se vidjet Real Time log sta se radi i upisuje u RichTBox.

Svaka od radnji je zasebna fuknkcija.

Imate koj hint kako to napravit da dok se funkijca odvija po formi se moze klikat i vidi se tocno u RichTBox-u u kojem je statusu. A ne da sve izbaci odjednom.
[ Shadowed @ 29.01.2008. 21:35 ] @
Pozovi Application.DoEvents() metod da se osvezi interface i da odgovori na dogadjaje.
[ Pharos @ 29.01.2008. 23:04 ] @
Koristiš li threadove?
[ sallle @ 30.01.2008. 00:22 ] @
a imas i kontrolu backgroundworker (imas na msdnu kako da je koristis) - al cini mi se da je nekako elegantnije i lakse da sam pravis novi thread
[ DjordjeRd @ 30.01.2008. 10:57 ] @
http://support.microsoft.com/kb/315577

Eto rešenja i za VB 2005. Isprobano, radi, lako se kapira.
[ xxxrugby @ 30.01.2008. 11:19 ] @
E sad sam gledao to po netu i nikako da nadjem neki dobar tutorial.

Uglavnom. Ako ocu da skroz izbacim taj zaseban thread ipak treba mu poslat neke parametre. A to mi nikako nejde.
A i taj thread bi mi trebao vratit neki parametar.
Al taj dio nisam nigdje nasao dobro opisan.
Ukoliko ja to skroz izoliram i kroz kod napucam parametre onda to radi super. Al to nije to. Trebao bi u thread nesto poslat i on mi nesto vratit.

[Ovu poruku je menjao xxxrugby dana 30.01.2008. u 20:52 GMT+1]

Ok. Iskoristio sam txt file kao temp pohrana i vucenje podataka.
Kako da pricekam thread pa kad zavrsi da onda program ide dalje. Danke.

Ukoliko stavim
do
{
Thread.Sleep(1);
} while (trd.IsAlive);
OPed mi je zablesavljena glavna forma. Pa onda s tim nisam nista dobio.

[Ovu poruku je menjao xxxrugby dana 30.01.2008. u 22:29 GMT+1]
[ Bojan Komazec @ 30.01.2008. 21:47 ] @
Pretpostavimo da na Form-u imas dve kontrole, jedan Button (sa textom npr. "Ping") i TextBox (ili vec neku kontrolu u kojoj mozes da prikazes multiline text kao i da append-ujes (dodajes na kraj) nove poruke na postojece). Pretpostavimo da zelis da pingovanje i rad sa socketima pocne kada korisnik pritisne Button "Ping". Kreiraj event-handler za event Click. Neka se zove button_Click(). U njemu kreiraj i pokreni thread. Za parametre thread-a je najbolje da kreiras svoju custom klasu ciji ce member-i nositi informacije. Npr. recimo da je parametar thread-a timeout (koliko zelis da cekas npr. na odgovor sa servera).

Code:

using System;
using System.Windows.Forms;
using System.Threading;

namespace ControlsTest1
{    
    public partial class Form1 : Form
    {
        protected delegate void AppendTextCallback(string textToAppend);


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //  disable-uj button "Ping"

            // ispali thread
            ThreadParams threadParams = new ThreadParams();
            threadParams.GetTimeout = 1000;

            Thread workerThread = new Thread(new ParameterizedThreadStart(DoPinging));
            workerThread.IsBackground = true;
            workerThread.Start(threadParams); // ovde prosledjujes parametre u thread metodu
        }

        // ova metoda se izvrsava u novom thread-u
        // ako iz nje zelis da menjas atribute neke GUI kontrole, moras da koristis InvokeRequired/Invoke() i delegat
        private void DoPinging(object arg)
        {
            // object moras cast-ovati na odgovarajuci klasni tip - ThreadParams
            ThreadParams threadParams = (ThreadParams)arg;

            int timeout = threadParams.GetTimeout;

            //...ovde radi sta god hoces sa socketima, otvaraj, pinguj...koristi timeout...

            // Za svaju akciju koja se (iz)vrsi zelis da dodas text u textBox.
            // Evo kako ces to da uradis:
            
            // recimo da zelis da posaljes poruku "Pinging IP1..."
            AppendText("Pinging IP1...");

            // ..nastavi sa pingovanjem drugog servera...

            // ...ponovo dodaj poruku...

            // na samom kraju: enable-uj button "Ping", koristeci dodatni delegat i helper f-ju
        }

        // helper f-ja za rad sa GUI kontrolom 
        protected void AppendText(string textToAppend)
        {
            if (this.textBox1.InvokeRequired)
            {
                AppendTextCallback callback = new AppendTextCallback(AppendText);
                this.Invoke(callback, new object[]{textToAppend});
            }
            else
            {
                this.textBox1.AppendText(textToAppend);
            }
        }
    }

   // najprostija klasa...
   // najbolje da je deklarises u posebnom .cs fajlu
   // ako ipak zelis da bude ovde, stavi je POSLE deklaracije Form-e, inace ce ti VS Designer 
   // prijavljivati gresku 
    public class ThreadParams
    {
        private int timeout;

        public int GetTimeout
        {
            get
            {
                return timeout;
            }
            set
            {
                timeout = value;
            }
        }
    }
}


Ovako ce ti GUI (Forma i kontrole na njoj) ostati "odmrznute" i potpuno funcionalne dok ce se u pozadini izvrsavati socket-ski deo posla...

[Ovu poruku je menjao komarabbit dana 31.01.2008. u 10:51 GMT+1]
[ xxxrugby @ 02.02.2008. 15:49 ] @
Hvala.
To mi radi kada sam tako postavio.

E sad ja pozivam taj thread unutar for petlje.

Radim ovako

Code:

for (nest; nest; nest)
{
    //sad pozovam thread za ping
   //sad pozivam thread za TCP porting check
}


No kad to napravim pokrene mi se cjela petlja odjednom. Ono nema strukture.

Dali moze nesto ovako

Code:

for (nest; nest; nest)
{
    //sad pozovam thread za ping
              // da sad foma nebude zablesavljena ono forma normalna dobiva inpute al radi thread za ping (samo jedan thread dalje se ne izvrsava For petlja)

   //sad pozivam thread za TCP porting check
              // da sad foma nebude zablesavljena ono forma normalna dobiva inpute al radi thread za TCP (samo jedan thread dalje se ne izvrsava For petlja)
}
[ Predrag Glumac @ 02.02.2008. 16:27 ] @
Ako se ta petlja pokrece iz glavne forme, onda ne moze. Napravi thread koji ce da vrti petlju, a izbaci threadove za ping i TCP (ako pingovanje mora da se izvrsi pre rada sa TCPem).
[ xxxrugby @ 02.02.2008. 16:50 ] @
Hvala na odgovoru.
Bas sam to poceo da radim. Izbacio sam thredove.

Napravio sam jedan thread u kojemu se iz ThreadParam povlace parametri dali da radi oboje ili samo jedno.

Jos jedino moram napravit prosljedit LB u Thread. A vec cu otkrit kako, vjerojatno preko string[].

Hvala na odgovorima.