NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Neaktivní uživatel:4.8.2017 14:18

Ahoj, mám aplikaci, která při startu vytvoří splashForm, následně vytvořím mainForm - tam se mě následně nahrají data z databáze a poté splashForm zavřu a mainForm zoobrazím..

Zde je kód pro splashForm:

public partial class SplashForm : Form
   {
       private static Thread _splashThread;
       private static SplashForm _splashForm;

       public SplashForm()
       {
           InitializeComponent();
       }


       public static void ShowSplash()
       {
           if (_splashThread == null)
           {
               _splashThread = new Thread(new ThreadStart(DoShowSplash));
               _splashThread.IsBackground = true;
               _splashThread.Start();
           }
       }


       private static void DoShowSplash()
       {
           if (_splashForm == null)
               _splashForm = new SplashForm();


           Application.Run(_splashForm);
       }


       public static void CloseSplash()
       {
           if (_splashForm.InvokeRequired)
               _splashForm.Invoke(new MethodInvoker(CloseSplash));

           else
               SplashForm.ActiveForm.Close();
               Application.ExitThread();
       }


       private void SplashForm_Paint(object sender, PaintEventArgs e)
       {
           LinearGradientBrush br = new LinearGradientBrush(this.ClientRectangle, Color.FromArgb(0,30,79), Color.FromArgb(86, 151, 255), 90, false);
           e.Graphics.FillRectangle(br, this.ClientRectangle);
       }
   }

toto je kód z Program.cs

SplashForm.ShowSplash();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Main main = new Main(args);
SplashForm.CloseSplash();
main.Visible = true;
main.Activate();
main.BringToFront();
Application.Run(main);

Celou aplikaci pak zavírám z tlačítka v mainformu

try
{
    Application.Exit();
}
catch (Exception ex)
{
    MessageBox.Show(ex.StackTrace);
}

Celá aplikace však ve 2 z 10ti případů nejde tlačítkem ukončit s chybou ...

System.IndexOu­tOfRangeExcep­tion

Nenapadá vás někdo, kde sem udělal chybu? Tuším, že to bude mít něco co dělat s thready ale...nemůžu na to nějak přijít.

Odpovědět
4.8.2017 14:18
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Štěpánek:4.8.2017 14:34

Předpokládám, že SplashScreen používáš v jiném vlákně proto, abys v hlavním vlákně natahal data. Nebylo by jednodušší ten Splash spustit v hlavním vlákně a data tahat "na pozadí" buďto pomocí ručního vytvoření jiného vlákna nebo třeba pomocí BackgroundWorkeru?

Nahoru Odpovědět
4.8.2017 14:34
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Neaktivní uživatel:4.8.2017 14:46

Je nieco v InnerException? Co stacktrace z prislusnej vynimky? Je v nom nejaka zaujimava informacia, ktora by ostatnych dokazala navigovat blizsie?
Osobne by som tuto logiku riesil v App.xaml.cs (pokial sa jedna o WPF). Riesil vytvorenie Splashu, jeho uzatvorenie, zobrazenie Main okna.

Nahoru Odpovědět
4.8.2017 14:46
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:4.8.2017 18:39

Bohužel jsem tu chybu zkoušel dneska celej den vyvolat a nic... je to jak hledat jehlu v kupce sena. Na kódu samotném chybu nikde nevidíte?

Nahoru Odpovědět
4.8.2017 18:39
Neaktivní uživatelský účet
Avatar
HONZ4
Člen
Avatar
Odpovídá na Neaktivní uživatel
HONZ4:4.8.2017 19:58

V uvedeném kódu není nic co by mohlo vyvolat IndexOutOfRan­geException.. Prostě někde přistupuješ k prvku s indexem mimo rozsah listu, pole, nebo jiného seznamu.

 
Nahoru Odpovědět
4.8.2017 19:58
Avatar
Neaktivní uživatel:5.8.2017 8:18

No, ale neprochází předce application.exit polem všech otevřených formulářů aby je zavřel? Aspoň tak sem to pochopil? Nezavírám třeba ten splashform špatně?

Editováno 5.8.2017 8:18
Nahoru Odpovědět
5.8.2017 8:18
Neaktivní uživatelský účet
Avatar
HONZ4
Člen
Avatar
HONZ4:5.8.2017 19:29

já nechápu proč to nemáš nějak takto:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        splashForm splash = new splashForm();
        splash.Show();
        splash.Refresh();
        //načítání dat
        splash.Close();
        Application.Run(new Form1());
    }
}
 
Nahoru Odpovědět
5.8.2017 19:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.