listbox wyświetlanie w czasie rzeczywistym

0

Witam.
Mój pierwszy post tu, więc jak pewnie się domyślacie dopiero zaczynam programować w C# i chcę uprzedzić, że na studiach tak na prawdę nie nauczyli mnie nic jak widzę, stąd też proszę jeśli już to łopatologicznie o jakieś małe wyjaśnienie :P
Mam pewne problemy z prostym skanerem portów. Otóż jak widać na obrazku wygląda okienko tak i button który odpowiedzialny jest za skan tak. Borykam się z problemem natury technicznej, tzn. Porty jako tako skanuje, jednak robi to baardzo długo, pewnie wina wbudowanego klienta tcp ale wyniki w listboxie wyświetla dopiero po pełnym skanie, nie tak jak bym chciał. Tzn. według mnie powinno to działać jak np. w pętli w C++, gdzie wyniki są wyświetlane na bieżąco, po pierwszym przejściu pętli - wynik na ekranie, po drugim - wynik na ekranie i tak dopóki sobie nie obliczy. Tu program jakby się zwiesza w momencie Skanu, im więcej portów tym dłużej rzecz jasna, ale nawet przy kilku czeka się i czeka i po jakimś tam czasie X pokazuje dopiero wszystko na raz. Chciałem się zapytać, czy można coś z tym zrobić?

http://desmond.imageshack.us/Himg826/scaled.php?server=826&filename=okienko.jpg&res=medium

[code] private void button1_Click(object sender, EventArgs e)
{
int port = System.Convert.ToInt16(numericUpDown1.Value);
int port2 = System.Convert.ToInt16(numericUpDown2.Value);
string host = textBox1.Text;
while (port <= port2)
{
listBox1.Items.Add("Skanowanie portów dla " + port + " " + host);
try
{
TcpClient klient = new TcpClient(host, port);
listBox1.Items.Add("Port: " + port.ToString() + " jest otwarty");
}
catch
{
listBox1.Items.Add("Port: " + port.ToString() + " jest zamknięty");
}
++port;
}

    }[/code]

@add
Zapomniałem dopisać, że przy otwartym porcie praktycznie od razu go wyświetla. I tak ogólnie to nie chodzi już mi tyle o czas tego skanowania, co o to wyświetlanie by na bieżąco pokazywało "Port XXX zamknięty" bądź "(...) otwarty", a nie wszystko na raz.

0

Dlatego że robisz to wszystko w jednym i tym samym wątku, przez co wątek GUI jest blokowany. Ten temat powraca jak bumerang, poczytaj o wątkach i Invoke.

silas177 napisał(a)
 int port = System.Convert.ToInt16(numericUpDown1.Value);

Bez sensu. Int16 to short a nie int. Konwertuj to do Int32.

Oprócz tego, za każdym razem kiedy próbujesz się połączyć, to wypadałoby również to połączenie zamknąć skoro go dłużej nie używasz.

Aha, i kontrolki sobie nazywaj jakoś sensownie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1