Newsgroup: it.comp.lang.visual-basic
Titolo: Che Ka§§o è successo ???

dopo giornate intere di diligente lavoro ecco che dopo l'ultima modifica 
(alquanto innocua) mi è sparito lo schermo del 'run'.
Cioè io clicco sulla freccetta per far eseguire il programma ( in debug 
mode) e la schermata del 'run' , cioè la GUI del programma, non mi appare.
Tutto si pianta e posso uscirne solo schiacciando il tasto 'stop' (il 
quadrato' sullo schermo di debugging.
Che cosa è successo `Ad un tratto il mio programma è diventato troppo 
grande per la memoria ?
O che cos altro ??
Sto facendo molti loop, è vero, ma accidenti un 42000 x 1000 x 128 
dovrebbe poterli sopportare. e poi, perchè un simile sintomo ???
Se avete qualche idea, datemi un suggerimento.
Sarebbe proprio una frustrazione buttare via il lavoro intenso di due 
settimane !!!!

 dovrebbe poterli sopportare. e poi, perchè un simile sintomo ???
Non puoi togliere qualche zero a quei loop ? giusto per provare!
-- 
Greg 


Ho tolto tutti i loop.  Non succede niente.  me l'aspettavo, perchè non 
arriva nemmeno alle prime stampe di controllo. Eppure tutto funzionava 
perfettamente. Non dà proprio segni di vita. Non appare nemmeno la GUI 
iniziale.
E' proprio un caso misterioso ! Uno schifo !

>
Era proprio quello. Avevo tolto i loop meno che nell'inizializzazione.
Che erano nel Form_Load.
Ora ho tolto anche quelli e funziona.
Ma ka§§o, devo forse comprarmi una Sun Workstation per fare un loop 
42000 x 1000 x 128 !! Accidenti, ho 1,8 Ghz e 1 GB di RAM !! Intel 
processor.... porcaccia sozza, mica sono milionario...
Vabbé, almeno ora so dov'è il problema !
Grazie comunque.

 Grazie comunque.
Vedi se puoi spostar qualcosa in Inizialize invece che in Load; spesso 
migliroano tante cose
-- 
Greg 


ok grazie. mo' ci provo.

 ha scritto nel messaggio 
news:isfca0$9fh$1...@tdi.cu.mi.it...

io proverei a farli prendere "fiato" in mezzo a tutti quei loop con un 
DoEvents.
Credo che se sposti il ciclo su Initialize dovrebbe essere peggio perchè 
prima cicla e poi carica il form e quindi effettua lo Show ancora più tardi, 
ma questa è solo una mia idea.
Chi nè sa di più ci informi!!! 

 processor.... porcaccia sozza, mica sono milionario...
Scusa ma stiamo parlando di un loop da oltre 5 milioni di iterazioni. 
Non sappiamo poi cosa fai all'interno di quel loop.
In azienda facciamo molto ETL su dati bancari e, mediamente, abbiamo 
tabelle dai 100mila record fino a 60 milioni ed oltre.
Ora, ci sono tabelle da 100 mila record che richiedono 2 ore di 
processazione e tabelle da 60 milioni che richiedono 30 minuti. Tutto 
dipende, ripeto, da cosa fai in quel loop.
Nicola

> Non mi piace un loop da *5 milioni* di iterazioni nel form-load.
Mi correggo, mi ero perso qualche zero, stiamo parlando di 5 miliardi di 
iterazioni!
Il mio discorso è ancora più valido in questo senso.
Non puoi (e non devi!) laciare un loop del genere in fase di caricamento 
del form. Ragiona multi threading e vedrai come le cose caambieranno in 
meglio.
Nicola


all'inizio devo inizializzare gli array.
Sono dati da encefalogramma.
...e non dirmi perchè non uso MatLab e EEGLAB ! Perchè MatLab mi sta sul 
ca§§o !! Piuttosto mi converto a Python.
  E poi voglio adattare il programma e la GUI alle esigenze particolari 
della clinica, in modo da avere un prodotto fatto da me "su misura" per 
la clinica.
E' la mia tesi e alla fine voglio un 30 e lode !!  :-))))


e qui casca l'asino. Il Multithreading l'ho solo sfiorato nel 1991 con 
la mia tesi in Modula-2. Quello sì era un linguaggio di programmazione 
(di Wirth) che offriva il multithreading facilmente.
Col VB .NET non so nemmeno dove si comincia a usarlo, non so come si fa 
il 'messsaging' tra i processi, come istituire i semafori etc.
Insomma mi tornerebbe più facile fare addirittura dei programmi separati 
che si passano dati attraverso files.
Il che è tutto meno che multithreading.

Dim t As System.Threading.Thread = New System.Threading.Thread(AddressOf 
miaProceduraSenzaArgomenti)
t.Start()
due righe di codice più semplice di così mi viene veramente difficile 
pensarla


il codice sarà pure di due righe, ma sapere (e capire a fondo) quello 
che fa, è un'altra cosa.

Beh insomma John.....alla fine a parte l'incazzatura che cosa vuoi non si è capito!
E' OVVIO....e NORMALE....e COSA BUONA E GIUSTA....che se vuoi usare una qualsiasi "cosa" il libretto di istruzioni va letto!
Così sembri molto mio cognato....che appena compra un nuovo "coso" prova ad usarlo premendo a caso 2 o 3 pulsanti...poi incazzato chiama me perchè legga il libretto di istruzioni e gli spieghi come usarlo!!!
Il multi threading in VB.net c'è!
SE...e ripeto SE...ed ancora SE...vuoi usarlo....devi studiare come è stato implementato!...ovvio che se usi C# o VB.net non userai le solite istruzioni del MODULA!
Quindi lo ripeto....
dov'è l'oggetto del contendere? ...io non l'ho capito!

 dov'è l'oggetto del contendere? ...io non l'ho capito!
l'oggento del contendere era, quando ho iniziato il thread, che mi è 
sparito lo schermo e mi sono incazzato a morte perchè non sapevo il perchè.
Ora l'ho scoperto e sono felice.
Le 'nuove cose' del VB .NET che non conosco e che non ho avuto tempo di 
leggermi l'anno scorso quando mi portavo a letto la sera il pesante 
manuale del Visual Basic 2008 e mi ci addormentavo sopra, non ho il 
tempo di impararle proprio ora.
Sono in ritardo di un anno e ho problemi che hanno una maggiore 
priorità. Io voglio solo che questo ca§§o di programma funzioni e mi dia 
dei risultati visibili (che abbiano senso) su un plot.
Sembra una cosa facile, ma in Visual Basic è più difficile ottenere ciò 
che in MatLab.
Ma a me MatLab sta sul ca§§o perchè non è gratis e poi è interpretato. 
(come il python del resto).
Sì, hai capio perfettamente : io voglio la botte piena e la moglie 
ubriaca. Voglio TUTTO a modo mio :-))))

 
Ahahha :D così però andrai incontro a forti incazzature :) credimi

 ubriaca. Voglio TUTTO a modo mio :-))))
L'unico modo per avere la botte piena e la moglie ubriaca è comprare
alcolici invece di usare il vino della tua botte per far ubriacare tua
moglie.
Non so, io comprerei della Wodka40° :-PPPP
Nicola

Credimi ....per esperienza....
a fare le cose in fretta si cambina solo casino!
Lo puoi fare solo se hai una demo ...e devi far vedere qualcosa al potenziale cliente!
Ma la vera applicazione deve essere progettata con i controcazzi altrimenti perdi tutti i tuoi neuroni a rincorrere bug di ogni tipo! Ed alal fine avrai uno spaghetti code immangiabile!
Ho capito che hai dei dati da elaborare....
è OVVIO che se sono tanti....non puoi mostrarli in tempo reale!
Nicola non può mostrare i suoi milardi di record in tempo reale TUTTI AGGIORNATI...probabilmente avrà delle finestre temporali (del tipo gli archivi aggiornati sono garantiti ogni mattina...alle 12...alle 18)
Se li vuoi avere tutti aggiornati...sei costretto ad avere sistemi costosissimi!
Nel tuo caso se devi mostrare segnali elettrici (ed un elettroencefalogramma lo è)...dovrai avere motori di rendering velocissimi!
Non solo...dovrai averne più di uno!
Da quanto mi ricordo un elettroencefalogramma ha vari canali da mostrare....
Ci sarà un processo che si occupa di disegnare un canale
ed un altro disegnerà un altro canale e così via.
Il problema è ....quanto "tempo reale" ti necessita?
se i dati sono raccolti e poi li devi mostrare...puoi provare ad usare VB.net ed un processo che scrive su un panel o su una picture o qualcosa di simile il grafico dei dati....4 canali? 4 Panel ed altrettanti processi indipendenti
Avrai dei ritardi ...ma non delle perdite di dati...e sopratutto la form principale si carica subito!...sono i vari panel...che arrivano dopo in base alla potenza del pc!
Guarda se è accettabile questo ritardo
Se non lo è.....devi usare un prodotto tipo mathlab fatto a posta per elaborare segnali e elaborarli rappresentarli! (che ha i motori di rendering scritti con linguaggi più performanti)....della serie.....se al Fermilab usano ancora il Fortran ci sarà un perchè!!!
Ma pensare di fare
Inizio load form
Inizio disegno controlli
recupero Array
lo scansiono....
eseguo calcoli
eseguo trasformazioni grafiche (plot linee)
continuo a disegnare controlli
.....e lamentarsi perchè al crescere dei dati rallenta.....è pari a spippolare a caso sui tasti del videoregistratore!
Scusa la franchezza.....
Se hai questi problemi....imparare a gestire il multi-threading...non è un ULTERIORE aggravio di neuroni....ma un investimento nello SGRAVIO dei tuoi coglioni quando il cliente ti contesterà la lentezza generale o la bruttezza del plotting! Lavorare prima....per non lavorare poi!
Ciao!


ROTFL!
Un saluto a Nicola e Marco.
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
 


Per me nessuna Wodka puo' tenere il confronto con una grappa friulana 
fatta in casa.
Una volta conobbi uno che la fece di 80 gradi.
Era da stramazzare a terra !

 Se hai questi problemi....imparare a gestire il multi-threading...non è un ULTERIORE aggravio di neuroni....
ma un investimento nello SGRAVIO dei tuoi coglioni quando il cliente ti 
contesterà la lentezza generale o
la bruttezza del plotting! Lavorare prima....per non lavorare poi!
Se è proprio necessario lo proverò. Ma già adesso ho programmi diversi 
per data sampling e plotting.
Poi arriverà la Independent Component Analysis e là saranno ca§§i acidi.
Comunque vi terrò aggiornati sulle novità. Perchè senzaltro ci saranno 
degli inghippi anche la.
Ciao.

ubriaca. Voglio TUTTO a modo mio :-))))
Qualche compromesso alla fine lo dovrai fare.
Per esempio io per le mie applicazioni sono passato da VB5, che uso ancora per
manutenere programmi più datati a QtPython
L'ho fatto principalmente per problemi di portabilità (funziona bene su Linux e
su Win) e anche perchè ho dovuto imparare ad usare le Qt per le applicazioni su
embedded, dal momento che oggi tutti vogliono grafica sofisticata con
trasparenze, touch e gadget vari anche nell'industriale.
Però per ottenere buone prestazioni mi tocca scrivere qualche parte in C++
nonostante la mia idiosincrasia per linguaggi con cose inutili come graffe e
punti e virgola. (nel basic non ci sono)
Quando uso il C++ mi sento come un elefante in una cristalleria, basta un inezia
per avere un fiume di errori di compilazione, altro che la riga gialla col
cursore di VB, bei tempi.
--
ciao
  Stefano


E' lo svantzaggio del C++. Ma una volta che lo si padroneggia 
completamente/profondamente, non lo lasci piů e fai TUTTO con quello.
Perfino le cazzatelle piů elementari.
Perchč il C++ ti permette di fare TUTTO. Anche le cazzate. Ti puoi 
masturbare coi pointers (e magari poi spendere sei mesi a cercare il 
bug), perň se ti va bene alla prima, fai TUTTO in due minuti.
Ti sembra di essere ritornato ai tempi del DOS e programmare in 
assembler..... :-)))

 
Bhè dai non esageriamo. E' vero che i puoi fare tutto ma a quali costi? 
Produttivamente parlando c'è di meglio al giorno d'oggi.

 Bhè dai non esageriamo. E' vero che i puoi fare tutto ma a quali costi?
A costo di spenderti la vita a fare il debug.
Comunque packages come ITK, VTK, IGSTK, per medical image processing 
sono ancora tutti in C++...<sigh>.

assembler..... :-)))
Ho programmato per diverso tempo in assembly Z80 e anche in ASM286, sono cose
che ricordo sempre con piacere, non foss'altro perchè avevo 5 lustri di meno.
--
ciao
  Stefano

 che ricordo sempre con piacere, non foss'altro perchè avevo 5 lustri di meno.
...e dici niente ??  il peso degli anni è un fardello più pesante che il 
debugging... <hahahahaha>

Am 05.06.2011 22:36, schrieb elmariachi:

come dicevo a suo tempo rispondendo a questo post, non è tutto oro 
quello che luccica e non sempre tutto funziona secondo gli esempi.
(anzi, spesso quasi mai).
Avendo ora il problema di mettere 'in background' un processo di calcolo 
molto costoso (un paio di minuti solamente, per adesso, in cui tutto lo 
schermo si blocca, ma diventeranno molti di più i minuti)
ora mi sono un po' approfondito nei DoEvents che sembrano non esistere 
più nel VB .NET (Windows Forms), e nei 'threads'.
Usando esattamente gli statement come descritti qui sorpa (e in più 
anche il 'join') non mi è riuscita una beata mazza.
Niente di niente.
Li ho provati in tutte le salse : nel 'main', poi nei singoli 'moduli',
dentro un button, fuori del button. Nisba.
Avendo esaurito tutti gli esempi sulla mia 'bibbia' nocnhè in rete, 
chiedo a qualcuno gentilmente di farmi un esempio funzionante di 
threading che possa 'isolare' un processo chiamato in un Button con 
'call pippo()', laddove Pippo si trova inun modulo proprio.
Dove si mette la dichiarazione di threading ? nel main ? nel button ? 
nel modulo? dentro  pippo ?
e le 'stampe' di controllo che si vogliono far apparire (nel mio caso un 
label.text) si devono mettere 'all'interno' del thread oppure 
all'esterno ? nel button ? nel main ? Nel modulo ?  Come routine separata ?
Sarò grato per qualsiasi chiarimento.
John.

 nel button ? nel main ? Nel modulo ?  Come routine separata ?
Il BackgroundWorker è la strada più semplice per risolvere quasi tutti 
i problemi di elaborazioni asincrone.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 nel modulo? dentro  pippo ?
Questo esempio, un pò datato, ti sarà d'aiuto:
http://aspalliance.com/1028_Multithreading_with_an_Example_of_NET_Application.6
Anche questo, un attimino più complicato, merita di essere studiato:
http://www.freevbcode.com/ShowCode.asp?ID=2098
Nicola

 
http://www.freevbcode.com/ShowCode.asp?ID=2098
Ottimo ! Grazie.

 Avendo esaurito tutti gli esempi sulla mia 'bibbia' nocnhè in rete, 
Non so che "bibbia" hai, ma davvero serviva poco più di quelle due righe per un esempio funzionante.. le dichiarazioni puoi metterle un po' dove ti pare.
Questo è uno dei tanti modi terra-terra; nota che il "girotondo" del callback è solo perchè c'è di mezzo un refresh di interfaccia windows form, perchè altrimenti davvero erano 3 righe in croce:
'Una form, un pulsante, una label
Public Class Form1
   Dim WithEvents worker As New MyWorker
   Delegate Sub AvanzamentoCallback(ByVal elapsed As System.TimeSpan)
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim t As System.Threading.Thread = New System.Threading.Thread(AddressOf worker.ProcessoLungo)
      t.Start()
   End Sub
   Private Sub worker_Avanzamento(ByVal elapsed As System.TimeSpan) Handles worker.Avanzamento
      If Me.Label1.InvokeRequired Then
         Dim d As New AvanzamentoCallback(AddressOf worker_Avanzamento)
         Me.Invoke(d, New Object() {elapsed})
      Else
         Me.Label1.Text = elapsed.ToString
      End If
   End Sub
End Class
'Una classe
Public Class MyWorker
   Public Event Avanzamento(ByVal elapsed As TimeSpan)
   Public Sub ProcessoLungo()
      Dim startP As Date
      Dim i As Long
      startP = Now
      'processo lungo 3 minuti
      For i = 1 To 180
         Threading.Thread.Sleep(1000)
         RaiseEvent Avanzamento(Now - startP)
      Next
   End Sub
End Class
Come detto più sopra, per cose semplici te la cavi ampiamente con il BackgroundWorker che si preoccupa da solo del thread-safe dei controlli qui sopra


Grazie anche a te del codice che ho scaricato e lo terrň pronto all'uso.
Per il momento ho sopperito con una 'progressBar' (io volevo qualcosa di 
piů sofisticato).
Ma vedo che cosě elementare non č, se hai dovuto creare una classe apposita.
Comunque mi va benissimo, cosě imparo ad applicare questo metodo.
Grazie.

 Ma vedo che cosï¿½ elementare non ï¿½, se hai dovuto creare una classe apposita.
Hai chiesto tu espressamente un esempio dove "pippo()" fosse in un modulo a parte, e tanto valeva allora fare una piccola classe con un evento... avrei potuto mettere la routine direttamente nella form altrimenti (altro motivo per cui dicevo "mettili dove ti pare")

 Hai chiesto tu espressamente un esempio dove "pippo()" fosse in un modulo a parte, e tanto valeva allora
 > fare una piccola classe con un evento... avrei potuto mettere la 
routine direttamente nella form altrimenti
 > (altro motivo per cui dicevo "mettili dove ti pare")
Infatti è meglio così, con questi esempi, così imparo cose nuove.
A dire la verità io il multithreading nel VB .NET non sapevo nemmeno che 
esistessse.
E' un bene che qualcuno, in questo thread (io non sapevo nemmeno cosa 
era successo) ha pensato di indirizzarmi al multithread.
E così piano piano anch'io mi faccio nuove esperienze.

 Come detto pi� sopra, per cose semplici te la cavi ampiamente con il BackgroundWorker che si
 > preoccupa da solo del thread-safe dei controlli qui sopra
Grazie del codice !!
Funziona benissimo !!!