Approccio di programmazione

martedì 29 luglio 2008 - 13.53

gabriel81 Profilo | Junior Member

Ciao a tutti!!
Forse saprete fare chiarezza su un mio dubbio... (Premetto che non sono esperto e che mi sto cimentato da autodidatta)

Recentemente ho cambiato aproccio di programmazione: prima scrivevo procedurale, quindi ogni form era un file.vb con tutto scritto, evento per
evento, condizione per condizione.
Anche l'accesso ai dati lo scrivevo volta per volta.
a parte la ridondanza del codice, e i tempi bibblici per creare una banalissima form, qusto approccio aveva un lato positivo: Rispondeva ai comandi in
maniera fulminea, un vero razzo!

Poi leggendo qua e là ho scoperto l'approccio ad oggetti, ho scoperto una cosa gandiosa, ovvero l'ereditarietà e questo mi ha aperto un mondo!
Infatti mi sono scritto tutti i componenti come combo, textbox e dagridview, dotandoli di metodi legati ad eventi che automatizzano i loro vari
comportamenti. E' uno spettacolo!
Poi ho scoperto che i form stessi sono classi (non ditemi che ho scoperto l'america....vi prego!!) e ho quindi fatto pratica con un Form padre MDI che
richiama istanze delle classi form che ho scritto.

venendo al sodo: mi sono reso conto che questo approccio rallenta il disegno dei form,l'accesso ai dati e la risposta ai comandi...
Certo, il programma non è lento, ma rispetto all'altro approccio è sorta una componente di latenza.
E' possibile velocizzare il tutto, oppure devo rassegnarmi al caro vecchio 'più sei comodo e più va piano'??
Inoltre, mi consigliate di implementare i metodi dispose() nelle classi o mi devo fidare del GC?

Grazie a tutti

hkproj Profilo | Newbie

beh guarda, se scrivi il codice che hai utilizzato, magari si puo' fare qualcosa.. ma detto così non si capisce molto..
nothing is impossible, I am nothing!

gabriel81 Profilo | Junior Member

Credo che in pratica ti dovrei postare tutto il progetto!!
Poi per la carità, sono lusingato della tua disponibilità, ma in realtà mi bastava sapere se ci sono delle malizie da sfruttare per velocizzare, magari delle accortezze che permettano di velocizzare il software.
Ad esempio ieri sera ho provato a mettere un po' di dispose() qua e la ma non è cambiato niente.
inoltre
Dal form padre apro i child così:
Dim f As New ClasseForm
f.MdiParent = Me
f.Show()

e così c'è latenza.
ho anche provato ad istanziare f come public al caricamento del form padre e a lanciare solo Me.f.show() al click del menu, ma è lento lostesso....
Ti mando uno shot dei form... non mi sembrano complicati..


1024x768 84Kb

hkproj Profilo | Newbie

beh guarda, il codice che hai scritto è corretto ed è l'unico metodo per fare ciò che desideri. Cioé se tu vuoi aprire un form e poi impostarlo come figlio di un'altro form, devi per forza creare un'istanza del form 'figlio'. E siccome VB.NET e tutto il .NET Framework è orientato agli oggetti, non esiste altro metodo.
Ah, dichiarando "f" come variabile pubblica, serve a poco, cioé di solito si dichiara un form quando bisogna utilizzarlo... poi si deve distruggere l'oggetto, dopo averlo utilizzato...
Tu che metodo utilizzavi prima, per effettuare questo tipo di cose senza l'utilizzo degli oggetti?
nothing is impossible, I am nothing!

gabriel81 Profilo | Junior Member

Ho capito dove stà il problema....
se guardate il form, vedete che ci sono 6 combobox che al caricamento del form si popolano da Db.
(Tra l'altro sono mie combo che hanno un metodo popoladati("SELECT * FROM TABELLA","colonnachiave","colonnalabel")!!troppo comode!)

Ovviamente questo crea latenza.
Quindi non è dovuto all'approccio di programmazione o alla grafica, bensì al fatto che il popolamento delle combo andrebbe eseguito in un thread separato, giusto?

gabriel81 Profilo | Junior Member

forse devo creare un nuovo thread che specifichi bene che si parla di multithearding e non di approccio ad oggetti???

hkproj Profilo | Newbie

mi sa che stai facendo un po di confusione.. allora: per utilizzare il Multi-Threading (System.Threading) e sopratutto la classe Thread, devi usare l'approccio OOP (Object Oriented Programming). In .NET non puoi neanche scrivere un Hello World senza utilizzare l'OOP, in quanto se utilizzi ad esempio un oggetto Console (System.Console), anche esso è un oggetto, e quindi si parla di OOP (Object Oriented Programming).
Quindi finché utilizzi il .NET usi gli oggetti, anche per rappresentare numeri. E anche scrivendo funzioni, le devi comunque racchiudere in un oggetto...
Ciao! comunque se vuoi un consiglio, leggi un libro sul .NET, vedrai che ti tornera' utile.
Lo stupido ti trascina verso il basso per batterti con le sue stesse armi

gabriel81 Profilo | Junior Member

No, non ho fatto confusione, però ammetto di essere stato poco chiaro...
Praticamente ho capito che la lentezza nel creare non è dovuto ad un tipo di approccio piuttosto che ad un altro! E di questo sono contento perchè l'approccio ad oggetti mi piace proprio.
La lentezza nel caricamento del form è dovuto al fatto che carico le combobox da database. Quindi per performante che sia, un po' ci va....
Infatti se commento il codice che carica le combo, il form si carica velocissimamente (però ovviamente le combo sono vuote!).

Ora ho pensato che sarebbe bello far gestire il caricamento delle combo a un backgroundworker.
Questa soluzione, permetterebbe all'applicazione di far visualizzare il form subito come se non dovesse riempire le combo, mentre il backgroundworker si occupa di riempire le combo?
Faccio questa domanda perchè ieri sera ci ho provato, però i risultati non si sono visti.
Praticamente su form.load faccio

Me.bg.RunWorkerAsync()


la routinde Dowork è questa:

Private Sub bg_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bg.DoWork
If (Not (Me.DescCL1A.InvokeRequired)) Then
Me.DescCL1A.PopolaValori("SELECT * FROM VCCCL1AA", "DescCL1A", "CL1A")
Me.DescCL1A.Text = ""
Me.DescCL1B.Text = ""
Me.DescCL1B.DisplayMember = "DescCL1B"
Me.DescCL1B.ValueMember = "CL1B"
Me.DescCL2.PopolaValori("SELECT * FROM VCCCL2A", "DescCL2", "CL2")
Me.DescCL2.Text = ""
Me.DescCL3.PopolaValori("SELECT * FROM VCCCL3A", "DescCL3", "CL3")
Me.DescCL3.Text = ""
Me.DescCL4.PopolaValori("SELECT * FROM VCCCL4A", "DescCL4", "CL4")
Me.DescCL4.Text = ""
Me.DescCL5.PopolaValori("SELECT * FROM VCCCL5A", "DescCL5", "CL5")
Me.DescCL5.Text = ""
Else
Dim d As New ScriviSuListViewDelegate(AddressOf scrivisullistiview)
Me.DescCL1A.Invoke(d)
End If
Ens Sub

Il delegato è questo:
Private Delegate Sub ScriviSuListViewDelegate()

mentre il codice che esegue il delegato è:
Private Sub scrivisullistiview()
Me.DescCL1A.PopolaValori("SELECT * FROM VCCCL1AA", "DescCL1A", "CL1A")
Me.DescCL1A.Text = ""
Me.DescCL1B.Text = ""
Me.DescCL1B.DisplayMember = "DescCL1B"
Me.DescCL1B.ValueMember = "CL1B"
Me.DescCL2.PopolaValori("SELECT * FROM VCCCL2A", "DescCL2", "CL2")
Me.DescCL2.Text = ""
Me.DescCL3.PopolaValori("SELECT * FROM VCCCL3A", "DescCL3", "CL3")
Me.DescCL3.Text = ""
Me.DescCL4.PopolaValori("SELECT * FROM VCCCL4A", "DescCL4", "CL4")
Me.DescCL4.Text = ""
Me.DescCL5.PopolaValori("SELECT * FROM VCCCL5A", "DescCL5", "CL5")
Me.DescCL5.Text = ""
End Sub


So per certo che esegue il codice di scrivisullistiview() e non quello di "If (Not (Me.DescCL1A.InvokeRequired)) Then"

Il risultato è che ora è più lento di prima a partire.... sob

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5