なぜ私のフォームはとても恥ずかしがり屋ですか?
-
22-08-2019 - |
質問
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に残して、糸を取り出します。