Effettuo alcuni controlli sul caricamento del modulo, ma il modulo viene bloccato per un periodo (alcuni millesimi di secondo). Per questo motivo, voglio visualizzare un messaggio come "caricamento dell'applicazione ..", ma non ho idea di come lo faccio. Spero che questo sia chiaro! Qualsiasi aiuto è bene accetto. Grazie in anticipo.Come faccio a visualizzare qualcosa come "caricamento ..." mentre eseguo alcuni controlli sul caricamento del modulo?
risposta
Idealmente, ciò che si vuole fare è eseguire i controlli su un thread in background, in modo che il thread dell'interfaccia utente non sia bloccato. Dai un'occhiata alla classe BackgroundWorker.
È necessario collegare i controlli all'evento DoWork dell'operatore in background e chiamare il metodo RunWorkerAsync()
di BackgroundWorker dall'evento Form_Load per avviare il lavoro in background.
Qualcosa di simile (nota, questo è testato):
BackgroundWorker bw = new BackgroundWorker();
public void Form_Load(Object sender, EventArgs e) {
// Show the loading label before we start working...
loadingLabel.Show();
bw.DoWork += (s, e) => {
// Do your checks here
}
bw.RunWorkerCompleted += (s, e) => {
// Hide the loading label when we are done...
this.Invoke(new Action(() => { loadingLabel.Visible = false; }));
};
bw.RunWorkerAsync();
}
È possibile creare un altro thread per visualizzare il messaggio di caricamento.
Per prima cosa serve un bool.
bool loading = true;
Creare un thread simile:
Thread myThread = new Thread(new ThreadStart(Loading));
myThread .Start();
Poi ha un metodo:
private void Loading()
{
while(loading)
{
//Display loading message here.
}
}
Quando hai finito di caricare qualunque sia sufficiente impostare il caricamento su false e il battistrada terminerà.
Il thread dell'interfaccia utente rimarrà occupato mentre il ciclo non sarà in grado di mostrare qualsiasi cosa l'app annd si bloccherà. –
No it wont. Questo è il punto del thread. – Axis
Dai un'occhiata al componente BackgroundWorker. Non hai bisogno di alcuna conoscenza di threading.
Ciò può essere ottenuto facilmente visualizzando un modulo separato eseguito su un altro thread. In questo modulo (chiamalo frmSplash) puoi inserire una gif animata o un testo statico. Il codice necessario è il seguente nel formato principale:
Dichiarare alcune variabili dopo la classe.
public partial class frmMain : Form
{
public Thread th1;
static frmSplash splash;
const int kSplashUpdateInterval_ms = 1;
// Rest of code omitted
Quindi aggiungere il seguente metodo al modulo principale. Questo avvia la schermata di avvio:
static public void StartSplash()
{
// Instance a splash form given the image names
splash = new frmSplash(kSplashUpdateInterval_ms);
// Run the form
Application.Run(splash);
}
Successivamente, è necessario un metodo per chiudere la schermata di avvio:
private void CloseSplash()
{
if (splash == null)
return;
// Shut down the splash screen
splash.Invoke(new EventHandler(splash.KillMe));
splash.Dispose();
splash = null;
}
Poi, nel vostro carico della forma principale, fare questo:
private void frmMain_Load(object sender, EventArgs e)
{
try
{
Thread splashThread = new Thread(new ThreadStart(StartSplash));
splashThread.Start();
// Set the main form invisible so that only the splash form shows
this.Visible = false;
// Perform all long running work here. Loading of grids, checks etc.
BindSalesPerson();
BindCustomer();
BindBrand();
// Set the main form visible again
this.Visible = true;
}
catch (Exception ex)
{
// Do some exception handling here
}
finally
{
// After all is done, close your splash. Put it here, so that if your code throws an exception, the finally will close the splash form
CloseSplash();
}
}
Quindi, se il modulo principale è chiuso, assicurati che la schermata iniziale sia chiusa anche:
Il codice per la forma Splash (In frmSplash.cs) è il seguente:
public partial class frmSplash : Form
{
System.Threading.Timer splashTimer = null;
int curAnimCell = 0;
int numUpdates = 0;
int timerInterval_ms = 0;
public frmSplash(int timerInterval)
{
timerInterval_ms = timerInterval;
InitializeComponent();
}
private void frmSplash_Load(object sender, EventArgs e)
{
this.Text = "";
this.MaximizeBox = false;
this.MinimizeBox = false;
this.ControlBox = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Menu = null;
}
public int GetUpMilliseconds()
{
return numUpdates * timerInterval_ms;
}
public void KillMe(object o, EventArgs e)
{
//splashTimer.Dispose();
this.Close();
}
}
Spero che questo ti aiuta. Potrebbe non essere il miglior codice mai scritto, ma ha funzionato per me.
È necessario creare un modulo che si sta scaricando qui .. è necessario creare l'oggetto di tale modulo e chiamato utilizzando il concetto di threading..e in FrmLoading inserire una Picturebox e impostare l'immagine .gif al suo interno.
FrmLoading f2 = new FrmLoading();
using (new PleaseWait(this.Location,() =>MethodWithParameter())) { f2.Show(this); }
f2.Close();
Come mostrato sopra codice è necessario creare classe PleaseWait.
PleaseWait.cs
public class PleaseWait : IDisposable
{
private FrmLoading mSplash;
private Point mLocation;
public PleaseWait(Point location, System.Action methodWithParameters)
{
mLocation = location;
Thread t = new Thread(new ThreadStart(workerThread));
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);
t.Start();
methodWithParameters();
}
public void Dispose()
{
mSplash.Invoke(new MethodInvoker(stopThread));
}
private void stopThread()
{
mSplash.Close();
}
private void workerThread()
{
mSplash = new FrmLoading(); // Substitute this with your own
mSplash.StartPosition = FormStartPosition.CenterScreen;
//mSplash.Location = mLocation;
mSplash.TopMost = true;
Application.Run(mSplash);
}
}
- 1. Come visualizzare l'immagine di caricamento mentre viene scaricata l'immagine effettiva
- 2. Come rimuovere tutte le righe DataGridView sul caricamento del modulo?
- 3. Come visualizzare un messaggio "Caricamento in corso ... attendere" in Winforms per un lungo modulo di caricamento?
- 4. Come funziona il caricamento del modulo es6
- 5. Come faccio a visualizzare ProgressDialog usando Fragment
- 6. Come faccio a mettere a fuoco il mio oggetto flash sul caricamento?
- 7. RequireJS non attende il caricamento del modulo?
- 8. Caricamento del modulo dopo Bootstrap angolare
- 9. Come faccio a visualizzare NSTextFinder
- 10. finestra del browser a schermo intero sul documento di caricamento
- 11. Come ottenere il caricamento del file senza un modulo
- 12. Come funziona il caricamento del modulo con TypeScript
- 13. Come visualizzare Div durante il caricamento con Pace.JS
- 14. come visualizzare l'anteprima di un'immagine prima e dopo il caricamento?
- 15. Caricamento file nel modulo joomla
- 16. Caricamento modulo sulla tastiera hotplug
- 17. Caricamento asincrono dei controlli utente in una pagina
- 18. Come implementare la barra di avanzamento del caricamento del file sul web?
- 19. Come faccio a registrare qualcosa in meteora?
- 20. Come impostare i controlli sul centro del winform?
- 21. request.FILES sempre vuoto sul caricamento di file
- 22. Come aggiungere indicatore di caricamento a AutoCompleteTextView
- 23. Come selezionare alcuni elementi in UICollectionView dopo il primo caricamento?
- 24. Silverlight 4 autorizzazione camma web sul caricamento del controllo utente
- 25. Come faccio ad attivare l'invio di un modulo al caricamento della pagina usando Jquery
- 26. Caricamento di file video mentre l'app iOS è in background?
- 27. Ottenere ClassNotFoundException sul caricamento dell'applicazione Android
- 28. Come faccio a caricare la pagina javascript dopo il caricamento asincrono del mio file manifesto
- 29. Caricamento FTP tramite modulo PHP
- 30. Come faccio a programatically messo Telerik rad griglia in "aggiungere nuova" modalità al caricamento della pagina
perfetto. Grazie mille. ;) –