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

progress bar i otvaranje formi

[es] :: .NET :: progress bar i otvaranje formi

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mvasicdo
Mladen Vasic
Doboj

Član broj: 104294
Poruke: 226
*.teol.net.



Profil

icon progress bar i otvaranje formi11.01.2007. u 13:45 - pre 210 meseci
pozdrav svima, evo jedno jednostavno pitanje za vas:
imam jednu forumu u kojoj se nalazi obicno dugme i progress bar, klikom na njega otvara mi se druga forma koja pri startovanju konektuje se sa bazom i cita podatke.
e sada posto mi se ova druga forma malo duze otvara, na koji nacin da mi progress bar prikazuje koliko je jos ostalo da se otvori, ako moze da uz progress bar ide i koliko je u postotcima zavrseno ...

ovo konektovanje sa bazom sam naveo kao primjer, imam neki formi koje se zbog neki drugi faktora sporo otvaraju ...
 
Odgovor na temu

electroNik
Nikola Milenković
Srbija

Član broj: 46941
Poruke: 78
*.rvkds.net.



Profil

icon Re: progress bar i otvaranje formi11.01.2007. u 16:55 - pre 210 meseci
Za to ti treba još jedan thread (pored glavnog UI thread-a). Pogledaj u help-u info o BackgroundWorker kontroli (ima i tutorijal ako se dobro sećam). Znači treba da pogledaš koje event-e treba da iskoristiš za tu kontrolu.

Ima jedan event koji te obaveštava dokle je BackgroundWorker stigao sa radom koji možeš da iskoristiš za pravljenje preciznog ProgresBar-a, a koga ti kontrolišeš kad će da se "opali".
Strategija je ova: Pre pozivanja BackgroundWorker-a iz tabele vidiš koliko će redova da se učitava (sa SELECT COUNT), a BackgroundWorker isprogramiraš da ti javi pri učitavanju svakog reda u DataGrid ili gde već.
Gone Shootin'
 
Odgovor na temu

mvasicdo
Mladen Vasic
Doboj

Član broj: 104294
Poruke: 226
*.teol.net.



Profil

icon Re: progress bar i otvaranje formi12.01.2007. u 08:23 - pre 210 meseci
ok hvala na odgovoru, ali kako da pokrenem progress na prvoj formi ako mi se backgroundworker nalazi na drugoj.
stavim da mi je progress bar public i vidim ga u drugoj formi ali ne mogu nikako da ga natjeram da radi, tj. ne znam kako da progress inkrementiram itd.
 
Odgovor na temu

electroNik
Nikola Milenković
Srbija

Član broj: 46941
Poruke: 78
*.rvkds.net.



Profil

icon Re: progress bar i otvaranje formi12.01.2007. u 16:14 - pre 210 meseci
Evo malo detaljnije:
Imaš BackgroundWorker. Tebi su bitna sledeća 3 event-a:
1. DoWork
2. ProgressChanged
3. RunWorkerCompleted

Ovaj treći i nije toliko bitan. On se pozove kad DoWork završi sa radom. U njega možeš da staviš kod za npr. otključavanje DataGrid-a (koga si na početku zaključao da korisnik ne bi menjao redove dok ih BackgroundWorker puni).

U DoWork treba da imaš sledeće:
- Integer koji nalazi broj redova koje hoćeš da dovučeš (npr. intCount)
- Integer koji predstavlja trenutni red koji dovlačiš (npr. intCurrent koji počinje od 0)
- Promenljivu tipa BackgroundWorker (npr. worker = CType(sender, BackgroundWorker))
- Promenljivu koja predstavlja jedan red iz baze (npr. row)
Za svaki uzeti red iz baze treba da povećaš intCurrent za 1, i da uradiš ovo:
Code:
worker.ReportProgress(intCurrent / intCount   * 100, row)
Ovaj kod vraća u glavni thread jedan red iz baze i dokle je stigao (od 0 - 100).

U ProgressChanged treba da ide:
Code:
Me.DataGridView1.Rows.Add(CType(e.UserState, DataGridViewRow))
Me.progressBar1.Value = e.ProgressPercentage
Ovde ti je e.UserState onaj row koji si poslao iz DoWork event handler-a

Za Me.DataGridView1.Rows.Add(CType(e.UserState, DataGridViewRow)) nisam siguran da je ispravan kod pošto on služi samo za ilustraciju.
Nadam se da je pomoglo.
Gone Shootin'
 
Odgovor na temu

mvasicdo
Mladen Vasic
Doboj

Član broj: 104294
Poruke: 226
*.teol.net.



Profil

icon Re: progress bar i otvaranje formi16.01.2007. u 08:26 - pre 210 meseci
hvala na pomoci, odradio sam na sledeci nacin i treba mi vase misljnje:

Code:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
                OleDbCommand cmd = new OleDbCommand("SELECT zavrseno,tema,ime,ime_oca,prezime,(select rj from radnaj where task.rj = radnaj.id)as 'rj',datum,vrijeme,alarm,id FROM task", clsConnection.CN);
                dt = new DataTable();
                OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                da.Fill(dt);

                count = dt.Rows.Count;
                int i = 0;
                foreach(DataRow row in dt.Rows)
                {
                    if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                    backgroundWorker1.ReportProgress(i);

//fDoc je forma u kojoj se nalazi funkcija FillData koja dodaje novi 
//row u DataGridView potom inkrementira "i" i vraca vrijednost
                    i = fDoc.FillData(i, (bool)row[0], row[1].ToString(), row[2].ToString(), row[3].ToString(), row[4].ToString(),row[5].ToString(),row[6].ToString(),row[7].ToString(), (bool)row[8],(int)row[9]);
                }
        }
....
....
....
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBarItem1.Maximum = count - 1;
            this.progressBarItem1.Value = e.ProgressPercentage;
        }

.....
.....
.....
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            backgroundWorker1.CancelAsync();
            this.progressBarItem1.Value = 0;
            this.labelStatus.Text = " Broj taskova: " +count.ToString();
        }



Posto mi je fDoc forma koja se otvara unutar forme frmMain (MDI), kada otvorim vise formi fDoc, sta mi on u pozadini odradjuje, da li za svaku formu otvara novi Thread do konekcije, da li je pozeljno na ovaj nacin to odradjivati ili nekako drugacije, da li su mozda moguce neke greske ako se pojavi vise rekorda itd.
Sve ovo pitam radi ispravnosti koda, odnosno programa i sto nisam nasao neko objasnjenje kako i sta
BackgroundWorker radi...
 
Odgovor na temu

electroNik
Nikola Milenković
Srbija

Član broj: 46941
Poruke: 78
*.rvkds.net.



Profil

icon Re: progress bar i otvaranje formi16.01.2007. u 16:36 - pre 210 meseci
Ne verujem da taj kod radi.

1.Ovo sa count ne bi radilo ni bez thread-ova, a kamoli ovako. Za realizaciju bi trebalo da se odradi još jedan poziv baze sa SELECT COUNT da bi video koliko će redova da vrati. To treba da se uradi pre poziva funkcije DoWork.

2.Ne možeš direktno da menjaš svojstva kontroli instanciranih na glavnom thread-u iz drugog thread-a (u ovom slučaju iz DoWork procedure)(neka me neko ispravi ako grešim). Da to može ReportProgress ne bi imao smisla tj. mogao bi direktno iz DoWork procedure da menjaš vrednost ProgressBar-a ili neke druge kontrole.

3.backgroundWorker1.ReportProgress(i) se obično stavlja na kraj petlje da bi radio precizno. Zamisli da imaš 2 record-a. U drugoj iteraciji bi ti prijavio da je uradio 1 (efektivno 50%), pa bi odradio drugi i izašao iz petlje. Tebi zbog toga na ProgressBar-u piše 50%.

4.Zvanje funkcije iz novog thread-a u UI thread sumnjam da će raditi. Znači fDoc.FillData mora da menjaš. Vidi moj primer i vidi pod 2.

5.backgroundWorker1.CancelAsync() ne treba da se stavlja u RunWorkerCompleted. Nema šta da cancel-uješ kad ti je BackgroundWorker završio sa radom. CancelAsync treba da ide u neko dugme (npr. btnCancel_Click ili myForm_OnClose), ako se korisnik predomisli oko učitavanja forme.

6.Za svaku instancu forme fDoc će se otvoriti novi thread, i ne bi trebalo da bude problema sa različitim brojem record-a.
Gone Shootin'
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.ptt.yu.

Jabber: DarkMan


Profil

icon Re: progress bar i otvaranje formi17.01.2007. u 09:02 - pre 210 meseci
Samo malu upozorenje, svaka dodatna informacija koju zelis da prikazes, bar na ovaj nacin sa progress barom, ce ti dodatno usporiti ucitavanje (narocito ako planiras da refresh-ujes progress bar posle svakog dodatog reda).

Ja sam ovo resavao tako sto sam dodao jednu labelu preko DataGridView-a koja je inicijalno sakrivena, a onda pri punjenju grida je prikazem sa tekstom "u toku je prihvatanje podataka iz baze..." (stavis labelu da ima okvir) i radim select iz baze i sa dataadapterom punim DataTable iz jednog poteza (a ne red po red) i to vezujem sa gridom. Po zavrsetku operacije samo sakrijem labelu.
 
Odgovor na temu

[es] :: .NET :: progress bar i otvaranje formi

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

Postavi temu Odgovori

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