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]