[ bobby63 @ 28.09.2008. 14:08 ] @
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
[ marko1981 @ 28.09.2008. 14:58 ] @
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.
[ mmix @ 28.09.2008. 15:28 ] @
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.

[ bobby63 @ 28.09.2008. 15:39 ] @
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.
[ mmix @ 28.09.2008. 16:05 ] @
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.
[ bobby63 @ 28.09.2008. 22:12 ] @
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]