Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

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

  • 9 odgovora
  • 2.820 pregleda

Najnovija ↓

Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 28.06.2009. u 18:07 · pre 211 meseci #1
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
Potpis
Hear all, trust nothing!
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 05.07.2009. u 18:58 · pre 210 meseci #3
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?
Potpis
Hear all, trust nothing!
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 06.07.2009. u 01:02 · pre 210 meseci #5
Mozda pomogne ako form2.show() pozoves iz posebnog thread-a pa ceo form2 radi u njemu umesto glavnom.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 06.07.2009. u 01:41 · pre 210 meseci #6
@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.
Potpis
Hear all, trust nothing!
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 06.07.2009. u 02:10 · pre 210 meseci #7
@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());
}
Potpis
My programs don’t have bugs, they just develop random features.
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 06.07.2009. u 14:08 · pre 210 meseci #8
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.
Potpis
Hear all, trust nothing!
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 06.07.2009. u 17:46 · pre 210 meseci #9
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.
Re: Osvezavanje text-a u controlama dok je druga forma zaposlena (VB NET) 06.07.2009. u 20:20 · pre 210 meseci #10
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.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme