Domanda

EDIT 2

Bene, sulla base del parere sulle risposte di seguito ho eliminato il mio thread approccio e ora il mio programma come questo:programma.cs

 static void Main(){

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

FrmWWCShell FrmWWCShell = null;
var splash = new FrmSplash();
splash.SplashFormInitialized += delegate
                                {
                                    FrmWWCShell = new FrmWWCShell();
                                    splash.Close();
                                };
Application.Run(splash);
Application.Run(FrmWWCShell);

}

E FrmSplash.cs come questa:

public partial class FrmSplash : Form
{

    public FrmSplash()
    {
        InitializeComponent();
    }

    protected override void  OnLoad(EventArgs e)
    {
        splashTimer.Interval = 1;
        splashTimer.Tick +=
            delegate { if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty); };
        splashTimer.Enabled = true;
    }

    public event EventHandler SplashFormInitialized;
}

Il problema è che non funziona a tutti ora.La schermata iniziale si apre per una frazione di secondo, il marque barra di avanzamento mai inizializza e poi scompare, mentre io aspetto il 10 sec per la dll e Principale Forma di spettacolo, mentre fissava il nulla....

Color me gravemente confuso ora!


POST ORIGINALE--> per riferimento

Ho realizzato un App Caricamento della schermata iniziale, che opera su un thread separato, mentre tutte le dll sono carico e la forma è sempre "Dipinto". Che funziona come previsto.La cosa strana è che ora quando lo Splash forma uscite invia il mio Form principale per il posteriore, se c'è qualcos'altro che aprire(cioèOutlook).Io inizio il thread in Programma.cs,

static class Program
{
    public static Thread splashThread;

    [STAThread]
    static void Main()
    {
        splashThread = new Thread(doSplash);
        splashThread.Start();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FrmWWCShell());
    }

    private static void doSplash()
    {
        var splashForm = new FrmSplash();
        splashForm.ShowDialog();
    }
}

E poi io alla fine una volta il mio FrmSearch_Shown viene generato un evento.

private void FrmSearch_Shown(object sender, EventArgs e)
    {
        Program.splashThread.Abort();
        this.Show();
        this.BringToFront();
    }

Io, come potete vedere, hanno provato a chiamare un Show() e/o BringToFront() su FrmSearch e ancora "salti"per il posteriore.

Che cosa mi manca?
Cos'altro posso provare?
Sto facendo così terribilmente ignorante che è il mio processo che è la causa di questo?
Dovrei file per il pensionamento anticipato?

Grazie per la comprensione!


EDIT 1

Ho provato l'impostazione del Primo di Proprietà sul mio Principale Forma di VERO.Questo mantiene il mio modulo da nascondere, ma mantiene anche l'utente di guardare a tutte le altre app.Sembra un po ' narcisistico di me...

È stato utile?

Soluzione

Prima di tutto, è molto importante che la UI di lavoro è di fatto il campo di applicazione principale del thread.In realtà io sono un po ' sorpreso che non stai ricevendo più gravi errori già mostrando la schermata iniziale in un thread in background.

Ecco una tecnica che ho usato:

Usare L'Applicazione.Eseguire sul vostro splash forma piuttosto che il tuo "vero" forma.

Nel splash forma, hanno un inizializzato evento:

public event EventHandler SplashFormInitialized

Creare un timer che attiva in un millisecondo, e trigger per l'evento.

Quindi nell'applicazione del metodo run è possibile caricare la vostra vera forma, quindi chiudere il tonfo di forma e non di un'Applicazione.Eseguire la forma reale

var realForm = null;

var splash = new SplashForm();
splash.SplashFormInitialized += delegate {
  // As long as you use a system.windows.forms.Timer in the splash form, this
  // handler will be called on the UI thread
  realForm = new FrmWWCShell();
  //do any other init
  splash.Close();
}
Application.Run(splash); //will block until the splash form is closed

Application.Run(realForm);

Splash possono includere:

overrides OnLoad(...)
{
   /* Using a timer will let the splash screen load and display itself before
      calling this handler
   */
   timer.Interval = 1;
   timer.Tick += delegate {
     if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty);
   };
   timer.Enabled = true; 
}

Altri suggerimenti

Provare a chiamare Applicazione.DoEvents() subito dopo sfilata.

Avviso:non chiamare la funzione DoEvents molto spesso, ma questo è uno di quei tempo.

EDIT:Clyde notato una cosa che non ho:si filettatura questo.Non eseguire qualsiasi interfaccia utente in un altro thread.Prendere il filo, lasciare l'Applicazione.DoEvents().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top