문제

앱 시작시 1 ~ 2 초가 걸리는 DB4O 데이터베이스에서 일부 데이터를로드해야했는데, 먼저 모든 데이터를로드해야하므로 나머지는 기다려야합니다. 자체 스레드 에서이 작업을 수행하면 나머지는 스레드 마감을 기다려야합니다. 스플래시 화면을 수행하고 싶거나 데이터가로드되어 자체 스레드가 필요한 것을로드하고 싶습니다. 어떻게 하시겠습니까?

CSHARP, .NET 3.5 및 WinForms를 사용하고 있습니다

도움이 되었습니까?

해결책

스타트 업에서 스플래시 화면을 표시하는 것은 쉽습니다. 응용 프로그램의 main () 메소드 (program.cs)에서 application.run (...) 라인에 이와 같은 것을 넣으십시오.

SplashForm splashy = new SplashForm();
splashy.Show();
Application.Run(new MainForm(splashy));

주 양식의 코드 및 생성자를 수정하여 다음과 같이 보이도록하십시오.

private SplashForm _splashy;
public MainForm(SplashForm splashy)
{
    _splashy = splashy;
    InitializeComponent();
}

그런 다음 MainForm의로드 이벤트가 끝나면 (아마도 데이터베이스 코드가 포함되어 있음)이 코드를 넣으십시오.

_splashy.Close();
_splashy.Dispose();

별도의 스레드 또는 배경 작업자로 데이터베이스 액세스를 선택한 경우, 배경 작업자가 그 일을하는 동안 나타나는 일종의 진행 상황 표시기 양식이 필요한 것만 큼 스플래쉬 화면이 필요하지 않습니다. 그것은 여기에서 내 대답과 다르게 이루어질 것입니다.

다른 팁

한 가지 방법은 아마도 더 나은 방법입니다. 진행 창/스플래시 화면이 될 새 대화 상자 양식을 만듭니다. 비트 맵이나 유일한 항목으로서 버리십시오. 메인 프로그램에서 대화를 인스턴스화하십시오. 진행 양식에 대한로드 이벤트를 무시하고 거기에서 데이터를로드하기 위해 배경 처리 작업을 수행 할 새로운 스레드를 시작하십시오. 이렇게하면 메인 앱에서 ShowDialog를 호출 할 수 있습니다.

system.componentmodel.backgroundworker를 사용하는 경우 스레드가 완료 될 때 이벤트를 쉽게 연결하고 해당 이벤트에서 대화 상자를 자동으로 종료 할 수 있습니다. 제어는 통화 응용 프로그램으로 되돌아 가면 완료됩니다.

나는 이전에 응용 프로그램에서 이런 종류의 일을 해냈고 잘 작동하지만 초보자 접근법이라고 확신합니다. 다음은 배경 스레드를 시작하는 양식의로드 이벤트의 샘플 코드입니다 (제 경우에는 큰 파일을 열고 구문 분석하는 경우).

 private void FileThreadStatusDialog_Load(object sender, EventArgs e)
 {
Cursor = Cursors.WaitCursor;

if (m_OpenMode)
{
    this.Text = "Opening...";
    StatusText.Text = m_FileName;
    FileThread = new BackgroundWorker();
    FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
    FileThread.DoWork += new DoWorkEventHandler(FileOpenThread_DoWork);
    FileThread.WorkerSupportsCancellation = false;
    FileThread.RunWorkerAsync();
}
else
{
    this.Text = "Saving...";
    StatusText.Text = m_FileName;
    FileThread = new BackgroundWorker();
    FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
    FileThread.DoWork += new DoWorkEventHandler(FileSaveThread_DoWork);
    FileThread.WorkerSupportsCancellation = false;
    FileThread.RunWorkerAsync();
}

}

그리고 여기에 완료된 방법이 형식이 존재하는 모습이 있습니다.

private void FileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    FileThread = null;
        DialogResult = DialogResult.OK;
        Close();
}

다음은 기본 대화에서 진행 대화 상자를 열어 놓는 방법입니다.

FileThreadStatusDialog thread = new FileThreadStatusDialog(m_Engine, dlg.FileName, true);
if (thread.ShowDialog(this) == DialogResult.OK)
{
        m_Engine = thread.Engine;
    FillTree();
}

Musigenesis의 대답에서 더 돋보이는 것을 강요하고 싶을 수도 있습니다.

Application.DoEvents();

직후

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