Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [vb.net-c#]come liberare una finestra bloccata da un lungo calcolo

    Ho una finestra con un pulsante. Quando premo il pulsante si scatena un evento che può durare anche molto (dell'ordine dei 10-20 minuti)

    1)
    La finestra è bloccata, non posso nè spostarla, nè ridurla ad icona e, soprattutto, non ricordo più il comando per ovviare :master:

    Pietro

  2. #2
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    potresti fare un thread che si occupa di questi calcoli...
    I got the remedy

  3. #3
    ciao, ci sono due strade. La prima è se usi VB.NET in C# e 'vergognoso' usarla. ;-)
    Basta che dopo la tua istruzione, inserisci un Application.DoEvents e come per magia qualcosa si sblocca.

    Se pero' questa operazione è composta da un giganteco Loop o simile, non basta questo trucchetto, e quindi devi usare l' asyncrono, insomme un po' come usare Ajax.
    Io ti do il link in C# preso dal blog di mauro minella:

    Delegati in C#

    In questo modo puoi anche gestire una piccola window modale con una gif stile progressbar, per 'ingannare' il tempo.
    E' piu' complesso ma per lo meno non rischi di inchiodare la macchina e non sapere a che punto sei della tua routine.

    ;-)

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    vi ringrazio ragazzi per i vostri consigli

    Ciao
    Pietro

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :master: giusto appunto per capire. Lasciando perdere per il momento la soluzione del thread asincrono, non ho capito la faccenda dell'uso "vergognoso" di Application.DoEvents.
    A me sembra che non sia legata nè al basic, nè a c# e le istruzioni in linea non ne sconsigliano l'uso.
    Non ti sembra che se un modus operandi è vergognoso in c#, lo è pure in basic?

    Pietro

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da pietro09
    :master: giusto appunto per capire. Lasciando perdere per il momento la soluzione del thread asincrono, non ho capito la faccenda dell'uso "vergognoso" di Application.DoEvents.
    Il "vergognoso" proviene dal fatto che si tratta di un escamotage, di un espediente utilizzato per ottenere un effetto il cui mezzo ideale restano comunque i thread.

    Inoltre, l'uso di Application.DoEvents può rendere meno performante (poiché forza l'elaborazione di tutti i messaggi in coda) il calcolo stesso, oltre al fatto che spesso si deve ricorrere a salti mortali (flag, disabilitazione di controlli, inibizione di metodi, ...) per evitare che l'utente possa invocare nuovamente il comando "pseudoasincrono" ("pseudo" perché non fa uso di thread) oppure chiudere addirittura l'applicazione.

    L'uso di thread è senz'altro il metodo più consono, più corretto, più controllabile, meno "error prone", per ottenere lo scopo.

    Siccome il vecchio VB6 non forniva meccanismi per supportare il multithreading, oltre al fatto che in certi casi si vorrebbe fare uso di DoEvents (anche se mi sfuggono i motivi), probabilmente è stato introdotto anche nel .NET Framework (ed esiste anche in altre librerie, ad esempio la VCL di Delphi); tuttavia, in genere lo si utilizza per implementare soluzioni che dovrebbero essere sviluppate con i thread, quindi meglio preferire questi ultimi, per questioni di performance, scalabilità e correttezza.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :master: Che dire? Spiegazione perfetta e soprattutto, convincente

    Comunque tranquilli L'esperimento l'ho fatto con un programma exe windows; ma adesso lo strasformo in una web form asp.net e lì debbo per forza di cose usare il thread asincrono.

    Ciao e grazie ancora delle spiegazioni
    Pietro

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da pietro09
    Comunque tranquilli L'esperimento l'ho fatto con un programma exe windows; ma adesso lo strasformo in una web form asp.net e lì debbo per forza di cose usare il thread asincrono.
    Occhio che certe cose potrebbero essere non proprio identiche... stai confrontando una classica applicazione Windows con un'applicazione Web... il mezzo è un po' differente.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da alka
    Occhio che certe cose potrebbero essere non proprio identiche... stai confrontando una classica applicazione Windows con un'applicazione Web... il mezzo è un po' differente.
    Certo, hai ragione. Ma per fortuna l'ho già fatto e so dove mettere le mani

    ps. certo che pagherei qualcosa per capire come caspita fa MapObject2 a metterci mezz'ora per produrre tre filetti :berto:

    Ciao
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.