Есть ли способ расширить заставку в виде отображаемого события?

Недавно я имел дело с этой ошибкой: BeginInvokeStackflowError

Я использую многопоточность, и, согласно моим исследованиям, это связано с тем, что в событии потоковой обработки .start() он вызывает .invoke. Если это сделать в событии mainform_Load до того, как оно будет готово, вы получите ошибку BeginInvoke.

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

 Private Sub MainWindow_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    'update table /search network       
    updateTable()
    'clean 
    cleanupTable()
    'fix label 
    updateLabel()
End Sub

person Kat    schedule 28.08.2014    source источник
comment
выполнять то, что вы не хотите, чтобы они видели в коде, который имеет пользовательский интерфейс, такой как класс, или до загрузки/отображения формы (в классе)   -  person Ňɏssa Pøngjǣrdenlarp    schedule 28.08.2014
comment
Ну, потоки, которые я переместил в показанное событие, собирают значения и создают столбцы для datagridview, которые я очищаю в таблице данных. Столбцы еще не созданы, поэтому это должно быть сделано после того, как это будет сделано.   -  person Kat    schedule 28.08.2014


Ответы (2)


Ваше приложение может быть запущено не методом по умолчанию «MainForm», предоставляемым VB Application Framework. Это будет использовать Sub Main в качестве отправной точки, позволяя вам контролировать, какие формы отображать и когда, и что происходит до этого:

' IF your form is declared here, it will be
' available to everything. e.g.:
' Friend mainfrm As Form1

Public Sub Main()
    ' this must be done before any forms/controls are referenced
    Application.EnableVisualStyles()

    ' the main form for the app
    ' just "mainfrm = New Form1" if declared above
    Dim mainfrm As New Form1

    ' eye candy for the user
    Dim splash As New SplashScreen1
    splash.Show()

    ' your code here to do stuff.
    ' you can also invoke your procedures on the main form
    ' mainfrm.FirstTimeSetup()

    ' for demo purposes
    System.Threading.Thread.Sleep(2500)

    ' close/hide the splash once you are done
    splash.Close()
    ' see note

    ' start the app with the main form
    Application.Run(mainfrm)

End Sub
  • Добавьте в проект модуль, обычно «программу».
  • Добавьте свой Sub Main
  • Перейдите в «Свойства проекта», снимите флажок «Использовать Application Framework».
  • Выберите Sub Main в раскрывающемся списке объектов StartUp.

Если вы объявите заставку как «Друг» вверху, вы действительно можете расширить ее до тех пор, пока все события загрузки формы не будут завершены, и закрыть ее там/тогда.

person Ňɏssa Pøngjǣrdenlarp    schedule 28.08.2014
comment
Спасибо за подробное объяснение! Я пробую это сейчас. - person Kat; 28.08.2014
comment
Я попробовал, решил несколько проблем. Единственное, что, я думаю, мне нужно выяснить, это как сделать так, чтобы мой загружаемый gif на экране снова анимировался в окне изображения (imageanimator не работает, хм). В остальном работает хорошо. Спасибо - person Kat; 28.08.2014
comment
если у вас есть настоящий анимированный GIF, Picturebox автоматически анимирует его. - person Ňɏssa Pøngjǣrdenlarp; 28.08.2014

Невозможно расширить экран-заставку, если вы реализовали его с помощью настроек проекта, однако вы можете использовать форму экрана-заставки в качестве начальной формы вместо основной формы. Что касается ожидания завершения потока для отображения формы (или скрытия экрана-заставки), рассмотрите возможность использования общедоступного логического значения в основной форме и измените его на True после завершения потока. Вы можете использовать таймер на экране-заставке, чтобы проверить это логическое изменение, а затем снова изменить непрозрачность формы на 1.

person Kieran Crown    schedule 28.08.2014