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

Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)

[es] :: .NET :: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)

[ Pregleda: 1912 | Odgovora: 9 ] > 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 Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)28.06.2009. u 17:07 - pre 180 meseci
Poz svima

Imam aplikaciju sa dve forme(Form1 i Form2) koje se u isto vreme vide na ekranu.
Prvo se staruje Form1 pa zatim otvara Form2.

Form1 je glavna forma i povremeno pristupa bazi i izvrsava neke proracune koji mogu da potraju.

Form2, uglavnom sluzi kao displej za neke rezultate ali ima vise tajmera koji rade non-stop i koji takodje vrse neke proracune.

Kod u obe forme radi dobro i sve se izvrsava na vreme.

Problem je sto dok Form1 radi (izvrsava nesto) nemam nikakve promene na Form2, tj ne mogu da osvezavam kontrole (textbox, label, etc).

Kod koji koristim za upis texta je Thread safe i radi OK.
Code:
Private Delegate Sub SetControlTextInvoker(ByVal ctl As Control, ByVal text As String)
    Private 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

A kod koji koristim za tajmere u Form2 je:
Code:
Public Sub TimerStartMeter()        'to stop timer do "tickerX.dispose"
        tickerMeter = New System.Threading.Timer(AddressOf TimerMethodMeter, Nothing, 5000, 100)      'Time in ms
    End Sub

    Public Sub TimerMethodMeter(ByVal state As Object)
        Dim trdMeter As New Thread(AddressOf TimerWorkMeter)
        trdMeter.IsBackground = True
        trdMeter.Start()
    End Sub

    Sub TimerWorkMeter()
        'Ovde ide kod koji se izvsava a upis u kontrolu se poziva sa
                 SetControlText(ImeKontrole, NekiString)
    End Sub

Problem bih mogao da resim da pozivam osvezavanje iz Form1 i to radi ali znacajno komplikuje stvar jer su sve varijable karakteristicne za Form2.

Pitanje je kako da u real-time radi osvezavanje u Form2 (pozvano iz Form2) dok je Form1 zaposlena?



Unapred hvala
Hear all, trust nothing!
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)30.06.2009. u 12:30 - pre 180 meseci
Taj dugotrajni posao izvrsi na drugom threadu, recimo pozivajuci zahtjevnu funkciju preko BeginInvoke ili slicno.

Pozdrav.
 
Odgovor na temu

bobby63
Nis

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



Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)05.07.2009. u 17:58 - pre 180 meseci
Nazalost, neizvodljivo. Glavni thread takodje konstantno pise po ekranu i crta grafiku.

Koliko vidim, upis u kontrolu nije moguc dok je glavni thread uposlen. Thread iz koga se vrsi upis radi normalno do trenutka upisa a tada staje i blokiran je sve dok se glavni thread ne oslobodi i onda, prakticno, nastavlja gde je stao.

Problem sam prikrpio zaustavljajuci glavni thread na svakih par sekundi da se ispisu sve vrednosti ali me interesuje da li je uopste moguce da se vrsi neki upis is ostalih threadova dok je glavni thread zauzet?
Hear all, trust nothing!
 
Odgovor na temu

bocy
Beograd

Član broj: 7508
Poruke: 90
*.adsl-a-2.sezampro.yu.



+1 Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)05.07.2009. u 20:14 - pre 180 meseci
Ja programiram u C# a ne VB, ali slican problem sam resio koristeci globalne promenljive.

Pozdrav
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)06.07.2009. u 00:02 - pre 180 meseci
Mozda pomogne ako form2.show() pozoves iz posebnog thread-a pa ceo form2 radi u njemu umesto glavnom.
 
Odgovor na temu

bobby63
Nis

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



Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)06.07.2009. u 00:41 - pre 180 meseci
@bocy
Probano vec, stavio sam te variable kao public shared i koristio volatileread i volatilewrite, synclock, thredove, timere, delegate i sve drugo sto mi je palo na pamet.
Problem je sto sve radi super, i u pravo vreme, ali kada se pristupi nekoj kontroli taj se thred ukoci sve dok se glavni thread ne oslobodi, tj. izgleda da glavni thread zakljuca sve kontrole dok se ne izvrsi ili dok glavni thread ne pozove apllication.doevents.

Aplication.doevents iako neelegantno resenje naizgled resava ovaj problem ali ima druge nuspojave a i iz ranijeg iskustva znam da u nekim slicajevima a i ako se precesto poziva moze da obori program.

@Shadowed
Interesantna ideja. Probacu pa javljam radi li.

Hear all, trust nothing!
 
Odgovor na temu

Sapphire
Denis Biondić
.NET software developer
Nürnberg, Germany

Član broj: 213086
Poruke: 290
62.113.8.*



+6 Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)06.07.2009. u 01:10 - pre 180 meseci
@bobby63

Mislim da ti je Mikelly dao validan odgovor ... U kodu pozivaš Invoke() metodu koja je sinhrona, i blokira thread koji je pozove dok se metoda ne izvrši (bolje rečeno, dok se ne izvrši delegat u argumentu). Pošto ti je UI thread jako zauzet, pozivajući thread dugo čeka i blokira sve dok se update kontrola ne izvrši. Rješenje je ako umjesto Invoke() pozoveš asinhroni BeginInvoke(), koji će odmah vratiti kontrolu u pozivajući thread.

@Shadowed

Zar pri kreiranju novog UI thread-a ne treba pozvati Application.Run(new Form2()), a ne new Form2().Show() (radi pokretanja message loop-a)?

Mislim, ovako:

Code:


new Thread(SomeMethod).Start();

...

public void SomeMethod()
{
     Application.Run(new Form2());
}

My programs don’t have bugs, they just develop random features.
 
Odgovor na temu

bobby63
Nis

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



Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)06.07.2009. u 13:08 - pre 180 meseci
Isti rezultat i sa invoke i sa begininvoke. Po teoriji bi begininvoke trebao da zavrsi stvar. Jednostavno, dok je glavni thread busy, kontrole su zakljucane za sve osim za glavni thread.

Kontrole su kreirane u runtime, mada sam probao i isto je i kada se kreiraju u editoru od VS.
Hear all, trust nothing!
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
79.143.100.*



Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)06.07.2009. u 16:46 - pre 180 meseci
Form1 i Form2 su ti na istom thread-u (GUI thread), jeli tako?

Kakav god da je posao koji radis u Form1, pozovi ga preko BeginInvoke. Napravi neku funkciju koja pristupa bazi i koja racuna te teske proracune i pozovi tu funkciju preko BeginInvoke. Onda iz te funkcije (koja se izvrsava na drugom thread-u) pristupaj kontrolama na formama Form1 i Form2 kao npr:

Code:

Form1.Invoke(delegat_na_funkciju_koja_vrsi_update_kontrola, argumenti_te_funkcije)


Na ovaj nacin ce update kontrola biti izvrsavana na GUI threadu, koji je sada slobodan (Framework radi context switch), a komunikacija sa bazom i proracuni na drugom threadu. Nema potrebe da provjeravas InvokeRequired dok si u BeginInvoke, jer je Invoke svakako potreban, a InvokeRequired je zahtjevna operacija.

Ne znam, trebalo bi da radi. Vrijedi probati.

Pozdrav.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)06.07.2009. u 19:20 - pre 180 meseci
Citat:
Sapphire: @Shadowed

Zar pri kreiranju novog UI thread-a ne treba pozvati Application.Run(new Form2()), a ne new Form2().Show() (radi pokretanja message loop-a)?

Mislim, ovako:

Code:


new Thread(SomeMethod).Start();

...

public void SomeMethod()
{
     Application.Run(new Form2());
}



Moze biti. Nisam to ranije radio a ono mi prvo palo na pamet, nisam se udubljivao.
 
Odgovor na temu

[es] :: .NET :: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET)

[ Pregleda: 1912 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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