문제

편집 2

좋아, 아래 답변에 대한 조언을 바탕으로 스레드 접근 방식을 제거했으며 이제 내 프로그램이 다음과 같습니다.program.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);

}

그리고 frmsplash.cs 이와 같이:

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;
}

문제는 지금 전혀 작동하지 않는다는 것입니다. 스플래시 스크린은 잠시 튀어 나오고, 천막 진행 막대는 초기화조차하지 않았으며, DLL과 메인 양식이 10 초를 기다리는 동안 사라집니다.

나를 색칠하라 심하게 혼란 스러웠습니다 지금!


원래 게시물-> 참조

모든 DLL이로드되는 동안 별도의 스레드에서 작동하는 앱로드 스플래시 화면을 구현했으며 양식이 "페인트"되고 있습니다. 그것은 예상대로 작동합니다. 이상한 점은 이제 스플래시 양식이 종료 될 때 내 기본 형태를 뒷면으로 보내고 다른 곳이 열린 경우 (즉, 전망). 나는 program.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();
    }
}

그리고 Frmsearch_shown 이벤트가 시작되면 끝납니다.

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

보시다시피, frmsearch에서 show () 및/또는 bringtofront ()를 호출하려고 시도했지만 여전히 "점프"뒤로.

내가 무엇을 놓치고 있습니까?
또 무엇을 시도 할 수 있습니까?
나는 이것을 너무 끔찍하게 무지하여 내 과정을 일으키고 있습니까?
조기 퇴직을 위해 제출해야합니까?

통찰력에 감사드립니다!


편집 1

나는 내 주요 양식에 가장 상단 속성을 설정하려고 시도했습니다. 진실. 이로 인해 내 양식이 숨겨져 있지 않지만 사용자가 다른 앱을 보지 못하게합니다. 나에 대한 작은 자기애적인 것 같다 ...

도움이 되었습니까?

해결책

우선, 기본 응용 프로그램 스레드에서 UI 작업이 수행되는 것이 매우 중요합니다. 실제로 배경 스레드에 스플래쉬 화면을 표시함으로써 이미 더 심각한 오류가 발생하지 않는다는 사실에 놀랐습니다.

내가 사용한 기술은 다음과 같습니다.

"실제"양식이 아닌 스플래시 양식에 응용 프로그램을 사용하십시오.

스플래시 양식에서 초기화 된 이벤트가 있습니다.

public event EventHandler SplashFormInitialized

1 밀리 초 안에 발사되는 타이머를 만들고 해당 이벤트를 트리거합니다.

그런 다음 응용 프로그램 실행 방법에서 실제 양식을로드 한 다음 스플래시 양식을 닫고 응용 프로그램을 수행 할 수 있습니다.

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);

스플래시에는 다음이 포함될 수 있습니다.

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; 
}

다른 팁

쇼 직후에 application.doevents ()를 호출하십시오.

경고 : Doevents를 자주 부르지 마십시오. 그러나 이것은 그 시간 중 하나입니다.

편집 : Clyde는 내가하지 않은 것을 발견했습니다. 다른 스레드에서 UI를 실행하지 마십시오. 스레드를 꺼내고 응용 프로그램에 남겨 둡니다 .doevents ().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top