VB9 Loading del form lento.....

mercoledì 28 gennaio 2009 - 17.31

fausto1965 Profilo | Newbie

Salve a tutti! non essendo uno sviluppatore di professione chiedo cortesemente se qualcuno può aiutarmi a risolvere il seguente _
problemino:
Sto realizzando una WindowsApplicaton con VB9, l'origine dei dati è un database di Access 2003.
Sull'evento "Load" del form uso il metodo Fill del TableAdapter per popolare il relativo DataSet ma nel caso di DataSet con un
consistente numero di records ovviamente l'apertura del form non è proprio istantanea come in altri casi.
C'è una soluzione?????
Requisiti tecnici:
OS - Windows XP Professional
RAM - 512 mb

Ringrazio anticipatamente e saluto!

Jeremy Profilo | Guru

Quante ne vuoi.....
la prima è gestire il codice nell'evento Shown....ma comunque, essendo mono thread...il refresh del form rimarrà sempre bloccato.

Altrimenti puoi eseguire il fill del DataSet in un thread separato..

Facci sapere...
Ciao

fausto1965 Profilo | Newbie

Intanto grazie!
Per la seconda opzione (Fill in un thread separato)....
cosa si intende????
Perdona l'ignoranza ma non sono troppo esperto

Jeremy Profilo | Guru

Intendo avviare l'operazione di caricamento dei dati nel dataset da un thread che non è lo stesso che gestisce l'aggiornamento del form e quindi di tutti i suoi controlli...ma uno separato..in modo da renderlo indipendente e non influente sulle prestazioni della tua applicazione.

Ciao.

fausto1965 Profilo | Newbie

Cioè, per esempio.... caricare i dati all'avvio dell'applicazione? (però non è funzionale se si aggiungono nuovi records)

Jeremy Profilo | Guru

Tu, adesso, carichi i dati nell'evento Load del Form....giusto??

Pensa, invece, che nell'evento Load del form, fai partire un'altro thread il quale si occupa di caricare i dati dal db per popolare il dataset e supponiamo che ci vogliano(per assurdo) 5 minuti...nel frattempo il thread principale(quello in cui è stato gestito l'evento Load) è libero di farti lavorare sulla tua applicazione, perchè il suo compito è stato solo quello di far partire il thread separato.

Spero di essere stato più chiaro...comunque in rete trovi molte informazioni....
Se poi ti serve una mano...fatti sentire.

Ciao...

fausto1965 Profilo | Newbie

Sicuramente ho capito male.... io ho scritto il seguente codice ma il problema persiste

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CaricaDati()
End Sub

Private Sub CaricaDati()
Me.MyTabellaTableAdapter.Fill(Me.TestLoadingDataSet.MyTabella)
End Sub

alexmed Profilo | Guru

Ciao
Scusate l'intromissione ma piacerebbe capire meglio una cose che Fausto non ha specificato:
Quanti sono questi consistenti record?
Quanti controlli hai sul form che carichi all'avvio?
Ciao
alexmed

Jeremy Profilo | Guru

>ho scritto il seguente codice ma il problema persiste

Si...perchè non è quello che intendevo io.
Io il codice di esempio te lo scrivo....però guarda che il concetto và approfondito....ma te ne accorgerai da solo il perchè

Prova così:

private newthread as new threading.thread(addressof CaricaDati)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load
newthread.start
End Sub

Private Sub CaricaDati()
Me.MyTabellaTableAdapter.Fill(Me.TestLoadingDataSet.MyTabella)
End Sub

fausto1965 Profilo | Newbie

Grazie per l'interessamento....... il numero dei record può aggirarsi intorno a 12.000 ma può anche aumentare, comunque, è vero si che i controlli presenti nel form non sono pochi, però se faccio il load senza il metodo fill (aprendo il form senza nessun record) il form si apre normalmente in un lampo.... ciao e grazie ancora!

alexmed Profilo | Guru

Ciao
In effetti 12.000 record non sono pochi, ma non sono neanche tanti, però quello che mi chiedo e se hai veramente la necessità di caricarli tutti e sempre all'avvio dell'applicazione.
Mi spiego meglio
Stò realizzando anch'io per un amico un'applicazione che prevede di caricare tutte le operazioni bancarie effettuate da una ditta in più banche.
Credo che nel giro di qualche anno la tabella "Operazioni" sarà popolata di un gran numero di record ed è per questo che all'avvio non carico niente (se non due calcoli fatti su una tabella) ma solo quando l'utente farà la scelta della Banca e dell'anno in corso carico i dati su un DGV.
Mi chiedo cosa se ne fà un utente di 12.000 record caricati su un Form.

Ciao

alexmed

fausto1965 Profilo | Newbie

Ok.. ho provato con il codice di esempio che mi hai scritto e ovviamente funziona.
Come mi hai accennato, ho compreso anche che l'argomento richiede veramente maggiori approfondimenti.
Forse è un pò troppo avanzato rispetto alle mie capacità ed esperienze, comunque cercherò di approfondirlo perchè è veramente interessante.
Ho riscontrato subito 2 problemi:
1) se il form contiene un datadridview non mostra i dati in sequenza (mostra soltanto un record);
2) quando vado a riaprirlo mi solleva l'eccezione "Impossibile riavviare il thread perché è in esecuzione o è terminato."

Ringrazio di nuovo e Saluto!

Jeremy Profilo | Guru

>se il form contiene un datadridview non mostra i dati in sequenza (mostra soltanto un record);
Questo è strano ma sicuramente risolvibile.
>quando vado a riaprirlo mi solleva l'eccezione "Impossibile riavviare il thread perché è in esecuzione o è terminato."
Questo si potrebbe essere colpa del codice che ti ho scritto io...ma si potrebbe risolvere senza problemi.
>Ho riscontrato subito 2 problemi:
E non finisce qui....
Comunque se approfondisci e ti serve aiuto....noi siamo qui.

Facci sapere...
Ciao

fausto1965 Profilo | Newbie

Quello dei 12000 o più record è un caso estremo...molto estremo, però il "problema" si verifica anche con un numero di gran lunga inferiore, mi spiego meglio: Sul web si tollera più facilmente il ritardo nel passaggio da un form ad un altro, mentre su un gestionale (monoutente) non è troppo simpatico, l'utente che deve inserire o elaborare quintali di operazioni ha bisogno di uno strumento snello e veloce...insomma devrei riuscire a trovare una valida alternativa a quel famoso "Fill" sull'evento load.

Saluti!

Jeremy Profilo | Guru

L'alternativa a Fill, che sappia io, non c'è.....nel senso che se devi riempire un Dataset hai per forza bisogno di un oggetto che te lo riempia(poi che sia uno o che sia l'altro).
La soluzione per rendere l'applicazione più snella è utilizzare il multithreading(come ti ho accennato)...ma non per questo più performante.

Io penserei, come diceva alexmed, piuttosto, se è davvero necessario caricare 12000 record in una datagridview all'avvio dell'applicazione...o forse basterebbe caricarne solo alcuni in base alle esigenze dell'applicazione?

Comunque, possiamo ipotizzare tantissime cose, ma lo scenario, al momento lo conosci solo tu...quindi le considerazioni le puoi fare solo tu.

Ciao

fausto1965 Profilo | Newbie

Bene, approfondirò l'approccio al multithreading che ritengo sia la soluzione migliore.
Riguardo al discorso del consistente numero di record da caricare sul load del form vorrei chiarire che la logica individuata da Alex (filtraggio in base al fabbisogno momentaneo) la adottavo già, però in alcuni casi mi trovo costretto (forse anche per le mie capacità) a dover caricare i dati da più tabelle sul load dello stesso form.
Visto che siamo quì, se miè consentito, vorrei porre un altro mio grosso handicap:
Nel DataSet se configuro il DataTable aggiungendo campi da altre tabelle formando così una query, il CommandText del metodo Update va a farsi benedire.... c'è un rimedio???

Saluti

Jeremy Profilo | Guru

>Nel DataSet se configuro il DataTable aggiungendo campi da altre tabelle formando così una query, il CommandText del metodo Update va a farsi benedire.... c'è un rimedio???
Forse non ho capito bene...ma credo che tu non abbia necessità di aggiungere dei campi alla datatable dopo aver popolato il dataset...credo si a sufficiente specificare i campi che intendi aggiungere, già nella SELECT iniziale...in questo modo, i campi te li ritrovi già nella DataTable.


Ma può darsi non abbia capito la domanda.

Ciao..

fausto1965 Profilo | Newbie

Mi correggo.... non volevo fare riferimento al popolamento del dataset o qualsivoglia operazione in runtime, il problema riguarda puramente la struttura (progettazione) del dataset.

Jeremy Profilo | Guru

Rileggendola bene...l'ho capita(forse).
Pertanto, ti rispondo che non lo sò, in quanto io non utilizzo i metodi UPDATE e Delete del DataAdapter(credo ti riferisca a quello) ma piuttosto eseguo delle query parametrizzate direttamente assegnandole al Command.
Comunque, credo tu possa risolvere, aggiungendo un'altra DataTable che rispecchia esattamente la struttura della tabella del Db che potrai utilizzare per l'aggiornamento dei dati senza ricevere nessun errore.

Ciao..

fausto1965 Profilo | Newbie

Benissimo è la soluzione a cui avevo pensato anch'io. Grazie per la tua conferma.

Se per ora non emergono novità... ti auguro un buon fine settimana. Ciao! e Grazie di nuovo
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5