質問

EDIT 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秒を待っている間marqueのプログレスバーは決してでも初期化し、その後、消えます

私に色のひどく混乱しての今!

<時間>

オリジナルのポスト - >参考のため

私は、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();
    }

あなたが見ることができるようにI、ショーを(呼び出して試してみました)、および/またはBringToFront関数()FrmSearch上、それはまだバックに "のジャンプ" ます。

私は何をしないのですか?
私は他に何を試すことができますか?
私は
?そう恐ろしく無知なことは、これを引き起こしている私のプロセスであること、これをやっています 私は早期退職のために提出する必要がありますか?

任意の洞察力をありがとう!

<時間>

EDIT 1

私はのTRUE のに私のメインフォームのTopMostのプロパティを設定してみました。これが隠れてから、私のフォームを保持しますが、それはまた、他のアプリを見てからユーザーを保持します。私の少し自己陶酔ようです...

役に立ちましたか?

解決

まず第一に、それはUIの仕事が主アプリケーションスレッドで行われることが非常に重要です。私は実際に一種のあなたがバックグラウンドスレッドでスプラッシュ画面を示すことによって、既に多くの重大なエラーを取得していないことに驚いています。

ここで私が使用した技術です。

あなたのスプラッシュフォームではなく、あなたの「本当の」フォームの

を使用するApplication.Runます。

あなたのスプラッシュフォームでは、初期化されたイベントがあります:

public event EventHandler SplashFormInitialized

1ミリ秒で発射し、そのイベントをトリガーするタイマーを作成します。

次に、アプリケーションの実行方法であなたは、あなたの本当のフォームをロードし、あなたのスプラッシュフォームを閉じて、実際のフォーム上にApplication.Runを行うことができます。

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関数を呼び出しますが、これは、それらの時間の一つではありません。

EDIT:あなたはこれをスレッドしている:クライドは、私はしませんでした何かに気づきました。別のスレッド上の任意のUIを実行しないでください。 )(Application.DoEventsに残して、糸を取り出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top