Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
VB9 Loading del form lento.....
mercoledì 28 gennaio 2009 - 17.31
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
fausto1965
Profilo
| Newbie
47
messaggi | Data Invio:
mer 28 gen 2009 - 17:31
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
1.527
messaggi | Data Invio:
mer 28 gen 2009 - 17:43
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
47
messaggi | Data Invio:
mer 28 gen 2009 - 18:04
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
1.527
messaggi | Data Invio:
mer 28 gen 2009 - 18:15
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
47
messaggi | Data Invio:
mer 28 gen 2009 - 18:25
Cioè, per esempio.... caricare i dati all'avvio dell'applicazione? (però non è funzionale se si aggiungono nuovi records)
Jeremy
Profilo
| Guru
1.527
messaggi | Data Invio:
mer 28 gen 2009 - 18:33
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
47
messaggi | Data Invio:
gio 29 gen 2009 - 12:59
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
1.186
messaggi | Data Invio:
gio 29 gen 2009 - 13:15
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
1.527
messaggi | Data Invio:
gio 29 gen 2009 - 13:25
>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
47
messaggi | Data Invio:
gio 29 gen 2009 - 18:32
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
1.186
messaggi | Data Invio:
gio 29 gen 2009 - 18:49
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
47
messaggi | Data Invio:
gio 29 gen 2009 - 20:26
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
1.527
messaggi | Data Invio:
gio 29 gen 2009 - 20:29
>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
47
messaggi | Data Invio:
gio 29 gen 2009 - 21:14
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
1.527
messaggi | Data Invio:
gio 29 gen 2009 - 23:47
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
47
messaggi | Data Invio:
ven 30 gen 2009 - 13:42
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
1.527
messaggi | Data Invio:
ven 30 gen 2009 - 13:48
>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
47
messaggi | Data Invio:
ven 30 gen 2009 - 14:01
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
1.527
messaggi | Data Invio:
ven 30 gen 2009 - 14:06
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
47
messaggi | Data Invio:
ven 30 gen 2009 - 14:19
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
Torna su
Stanze Forum
Elenco Threads
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 !