2012-03-09 2 views
0

в моем брызговом коде я получаю сообщение об ошибке. Это отдельная форма для обычного.Ошибка формы всплеска, несколько форм

public Form1() 
    { 

     InitializeComponent(); 
     Thread t1 = new Thread(new ThreadStart(SplashForm)); 
     t1.Start(); 
     Thread.Sleep(5000); // The amount of time we want our splash form visible 
     t1.Abort(); 
     Thread.Sleep(1000); 
    } 

В основном на части, которая говорит (новый ThreadStart (SplashForm));

У меня есть сообщение об ошибке «SplashForm».

Форма всплеска - это название формы. Он говорит, что это тип, но используется как переменная.

Любые идеи?

+0

Конструктор 'ThreadStart' принимает имя метода, а не тип (ваша форма является типом). – vulkanino

+0

Это не лучший способ реализовать Splash Screen, так как вы все равно закончите свою основную форму, висящую в фоновом режиме, и отложите загрузку после завершения всплывающего экрана. Экран заставки Google C#, более 80 000 результатов. – Lloyd

+0

Возможный дубликат [Проблемы с заставкой C#] (http://stackoverflow.com/questions/392864/c-sharp-splash-screen-problem) –

ответ

0

Вы должны указать имя метода в конструкторе потока, а не тип (SplashForm). Вы могли бы сделать что-то вроде этого:

public Form1() 
{ 
    InitializeComponent(); 
    new SplashForm().ShowDialog(); 
} 

и в классе SplashForm:

class SplashForm : Form 
{ 
    public SplashForm() 
    { 
     InitializeComponent(); 
     new Thread(run).Start(); 
    } 

    private void run() 
    { 
     Thread.Sleep(5000); 
     this.Invoke((MethodInvoker)delegate 
     { 
      this.Close(); 
     }); 
    } 
} 

Если вы получите исключение с вызовом из другого потока, вы должны попробовать трюк с MethodInvoker.

+0

Замечательный, 1up, но один вопрос .. Я получаю исключение: Необработанный исключение типа «System.InvalidOperationException» произошло в System.Windows.Forms.dll Дополнительная информация: Неверная обработка кросс-потоков: Control 'SplashForm' обращается к потоку, отличному от потока, на котором он был создан. –

+0

При запуске сообщения об ошибке вы получите несколько результатов, которые описывают тот факт, что вы не можете изменять элементы пользовательского интерфейса из потока, который не создал этот элемент, и что вы должны использовать 'Control.Invoke' для этого. –

+0

Я не могу понять, как это сделать, потому что это не элемент, на который вы нажимаете .. im so confused:/ –

0

Если .NET версии> = 3.5 вы можете использовать SplashScreen класс:

SplashScreen ss = new SplashScreen ("resource name"); 
ss.Show(true); // autoclose 

не надо писать код, чтобы отобразить экранную заставку.

Начиная с Visual Studio 2008 SP1, вы можете быстро настроить заставку с настройками по умолчанию.

Во всяком случае ваш код неверен, поскольку конструктор ThreadStart принимает имя метода, а не тип (ваша форма является типом).

+1

Больше, чем требование .Net 3.5, 'SplashScreen' требует, чтобы приложение было WPF-приложением. Поскольку OP говорит о «Формах», я думаю, что он не сможет использовать это. – ken2k

Смежные вопросы