Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)

[es] :: .NET :: .NET Desktop razvoj :: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)

[ Pregleda: 2266 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)28.09.2008. u 14:08 - pre 189 meseci
Kada se program staruje otvori se Form1
Zajedno sa Form1 startuje se i thread koji skenira seriski port (eButton)

Na Button u Form1 staruje se Form2 koja je povezana sa sql bazom

Sada mi treba da broj koji sam dobio u thread-u od eButton prebacim u jedan TextBox u Form2, medjutim to ne radi nikako ako se pokrece iz thread-a.
Koristim invoke tj:
Code:

Public Delegate Sub SetControlTextInvoker(ByVal ctl As Control, ByVal text As String)
    Public Sub SetControlText(ByVal ctl As Control, ByVal text As String)
        If ctl.InvokeRequired Then
            ctl.Invoke(New SetControlTextInvoker(AddressOf SetControlText), ctl, text)
        Else
            ctl.Text = text
        End If
    End Sub

Poz svima i unapred hvala
Hear all, trust nothing!
 
Odgovor na temu

marko1981
Marko Nikolic
Beograd

Član broj: 123059
Poruke: 144
*.bvcom.net.



Profil

icon Re: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)28.09.2008. u 14:58 - pre 189 meseci
Nije problem sigurno u tome sto se pokrece iz thread-a. Svaka forma je i inace thread za sebe, a metoda koju si poslao to resava.

Gde kreiras thread?
Odakle ga pozivas?
Sta prosledjujes kao ctl parametar?

Posalji bitan kod.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)28.09.2008. u 15:28 - pre 189 meseci
Ovo nije tacno, po defaultu sve forme su kreirane i rade iz istog thread-a i metodi i propertiji tih kontrola se ne mogu pozivati iz drugih threadova, jedini validni multithreaded metod je instance metod Invoke() koji efektivno stavlja delegat u Queue da bi bio pozvan iz thread-a koji je kreirao windows handle kontrole/forme. Za vise detalja pogledaj Control.Invoke metod u MSDNu.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Re: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)28.09.2008. u 15:39 - pre 189 meseci
Hvala na brzom odgovoru

Problem je negde u thread-u ili pozivanju iz njega jer na primer ako na Form1 stavim Button koji menja neku kontrolu na Form2 to onda radi bez problema a takodje ako preusmerim da se broj prikazuje na Form1, takodje radi.

evo bitnih delova koda:
Code:

    Private ComPortThread As Thread
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If ComPort.IsOpen = False Then ComPort.Open()

        ComPortThread = New Thread(New ThreadStart(AddressOf ComPortServer))  'Startuje thread za citanje com porta
        ComPortThread.IsBackground = True
        ComPortThread.Start()
    End Sub

   Private Sub Unos_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Unos_Button.Click
        Form2.Show()     'Prikazuje Form2
    End Sub

                        'Thread koji non stop prati seriski port
    Public Shared ComPortServerSTOP As Boolean = True
    Public Sub ComPortServer()
        Do        
        'Ovde ide citanje eButtona, parsing itd, nebitno za problem

         SetControlText(Form2.EButtonTextBox, ComString)    'Gde je ComString broj eButtona a eButtonTextBox control

        Loop While ComPortServerSTOP
    End Sub

                       'Ovaj deo proverava da li je INVOKE potreban ili ne
    Public Delegate Sub SetControlTextInvoker(ByVal ctl As Control, ByVal text As String)
    Public Sub SetControlText(ByVal ctl As Control, ByVal text As String)
        If ctl.InvokeRequired Then
            ctl.Invoke(New SetControlTextInvoker(AddressOf SetControlText), ctl, text)
        Else
            ctl.Text = text
            ctl.Refresh()
        End If
    End Sub


Problem bih mogao da resim tako sto bih npr mesto nove forme koristio sakriveni panel ali to nije elegantno resenje.
Hear all, trust nothing!
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)28.09.2008. u 16:05 - pre 189 meseci
Kad pokrenes Form1 ti dizes ComPortServer() thread koji u prvom ciklusu pokusava da upise tekst iako form2 jos nije prikazan, da li ti je u tom trenutku vec kreirana Form2 instanca?
Ako nije onda tebi ovde nista ne radi jer je com thread pukao vec u prvom ciklusu (null reference exception), exception te je izbacio iz loop petlje i ubio ti thread.

Probaj da pokrenes aplikaciju direktno iz VS-a u debug modu i prebaci exceptions da ti breakuje managed exception na "throw", pa vidi da li ti com thread uopste radi.

Sam delegat, Invoke i SetControlText ti izgledaju ok.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Re: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)28.09.2008. u 22:12 - pre 189 meseci
Izvinjavam se, moja greska, nisam dovoljno jasno obrazlozio kod. Evo kako taj deo izgleda:
Code:

                        'Cita seriski port i proverava eButton, predugo za ubacivanje

                        If Form2.Focused = True Then
                            SetControlText(Form2.EButtonTextBox, ComString)
                        Else
                            'Izvrsava neke sql komande
                        End If

Upis u Form2 se poziva samo kada je Form2 otvoren (i kada je eButton ispravno procitan i postoji u bazi) ali sam taj deo izbacio iz primera.
Kada Form2 nije otvoren onda se rade neke SQL pretrage itd.

Program funkcionise, tj sve radi osim tog upisa u Form2.
Thread cita seriski port bez problema, vec sam koristio ovu metodu u nekim ranijim projektima.

Koliko sam video svi upisi rade ako su iz glavnog threda, a takodje radi i upis iz ovog thread-a ako ide u Form1 ali bilo sta da pokusam da menjam iz tog thread-a u drugoj formi tj Form2 ne radi.
Debug mod ne prijavljuje nikakvu gresku.
Sve komande upucene u Form2 se izvrsavaju bez greska ali, nazalost, i bez ikakvog efekta.

Evo prikacio sam primer koji ilustruje o cemu pricam.

[Ovu poruku je menjao bobby63 dana 29.09.2008. u 02:04 GMT+1]
Hear all, trust nothing!
Prikačeni fajlovi
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Kako iz thread u Form1 da promenim text u TextBox-u u Form2 (VB 2005)

[ Pregleda: 2266 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.