マルチスレッドのスプラッシュ画面でクライアントまで、フルのC#?
-
09-06-2019 - |
質問
したいスプラッシュ画面表示をアプリケーションは出荷します。い形状のシステムトレイの制御に縛られます。また、スプラッシュ画面表示がこの負荷を少しの時間でアクセスするwebサービスAPIの移植に一部のドロップダウンズがあります。また、私はいくつかの基本的な試験のための依存関係る前に負荷できるのは、webサービスがご利用で、設定ファイルの読み取り可能).各相の起動時に、変更したいのスプラッシュ画面ます。
私は読書については何もなされていないスレッドがどんどん失われたがこれを管理する必要があるから、 main()
法?).私も欠か Application.Run()
作品は、このスレッドがこのを作るべきです。また、このフォルムを実現するとともにシステムトレイの制御には、"暮らし"の形ではスプラッシュからありますか?ができるのではないな負荷までの形が完成する。
んなコード資料、アルゴリズム/アプローチだったので図のことば:)
解決
でも、ClickOnceアプリかに展開、過去に使用しました Microsoft.VisualBasic
名前空間のスプラッシュ画面にネジ.すので参考に Microsoft.VisualBasic
組み立てらC#ます。純2.0でに多くのサービス
- いコミットメントラインからの継承
Microsoft.VisualBasic.WindowsFormsApplicationBase
オーバーライドの"OnCreateSplashScreen方法"はこのように:
protected override void OnCreateSplashScreen() { this.SplashScreen = new SplashForm(); this.SplashScreen.TopMost = true; }
非常に素直でおSplashFormるを作成する必要があります)を負荷するのは、その閉じて自動で一度にコミットメントラインは完成し出荷します。
この本当によるもの VisualBasic.WindowsFormsApplicationBase
もちろんどの試験によるマイクロソフトとして機能していくことや、サポートでも、他のアプリケーションに対する100%C#.
で一日の終わりを用意していますので、IL、 bytecode
とにかくんに使用しますか?
他のヒント
フレキシビリティが作成は別のスレッドを担うプラッシュ画面いたしました。
きます。純作メインスレッドおよび荷重の指定を必要とします。を隠し作業は非表示にすることができ形式で載荷します。
こForm1-するために必要なものは画面上の形SplashFormはトップレベルのborderles素敵なプラッシュ形式:
private void Form1_Load(object sender, EventArgs e)
{
Hide();
bool done = false;
ThreadPool.QueueUserWorkItem((x) =>
{
using (var splashForm = new SplashForm())
{
splashForm.Show();
while (!done)
Application.DoEvents();
splashForm.Close();
}
});
Thread.Sleep(3000); // Emulate hardwork
done = true;
Show();
}
後の見所Googleなどのためのソリューション、これが私のお気に入り:http://bytes.com/topic/c-sharp/answers/277446-winform-startup-splash-screen
FormSplash.cs:
public partial class FormSplash : Form
{
private static Thread _splashThread;
private static FormSplash _splashForm;
public FormSplash() {
InitializeComponent();
}
/// <summary>
/// Show the Splash Screen (Loading...)
/// </summary>
public static void ShowSplash()
{
if (_splashThread == null)
{
// show the form in a new thread
_splashThread = new Thread(new ThreadStart(DoShowSplash));
_splashThread.IsBackground = true;
_splashThread.Start();
}
}
// called by the thread
private static void DoShowSplash()
{
if (_splashForm == null)
_splashForm = new FormSplash();
// create a new message pump on this thread (started from ShowSplash)
Application.Run(_splashForm);
}
/// <summary>
/// Close the splash (Loading...) screen
/// </summary>
public static void CloseSplash()
{
// need to call on the thread that launched this splash
if (_splashForm.InvokeRequired)
_splashForm.Invoke(new MethodInvoker(CloseSplash));
else
Application.ExitThread();
}
}
プログラム。cs:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
// splash screen, which is terminated in FormMain
FormSplash.ShowSplash();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// this is probably where your heavy lifting is:
Application.Run(new FormMain());
}
}
FormMain.cs
...
public FormMain()
{
InitializeComponent();
// bunch of database access, form loading, etc
// this is where you could do the heavy lifting of "loading" the app
PullDataFromDatabase();
DoLoadingWork();
// ready to go, now close the splash
FormSplash.CloseSplash();
}
私の問題の Microsoft.VisualBasic
液--ただXP、Windows2003年末端のサーバーメインのアプリケーション形式表示(スプラッシュ画面)を背景に、タスクバーが点滅します。をウィンドウを前景/フォーカスコードはその他のワームまでGoogleです。
ことを義務付けられているが、これまた超越しの場合とネジ付きスプラッシュ画像の解決のためのコンポーネントのラインナップとなります。
ここで私が最終的につなぎ合わせたもの:
アプリです。ー:
<Application Startup="ApplicationStart" …
アプリです。ー.cs:
void ApplicationStart(object sender, StartupEventArgs e)
{
var thread = new Thread(() =>
{
Dispatcher.CurrentDispatcher.BeginInvoke ((Action)(() => new MySplashForm().Show()));
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
// call synchronous configuration process
// and declare/get reference to "main form"
thread.Abort();
mainForm.Show();
mainForm.Activate();
}
をお勧めしま呼び出し Activate();
直接の後に最終 Show();
の回答によるアク.
引用MSDN:
確認モードをonにしておくと形を作り出している。、 フロントの場合は、その活躍 申請か、を点滅させ窓 キャプションを保持されないようにする場合は、active 願います。の形で可視でなければならな このメソッドとして動作するときにのみ有効で
ない場合は起動メインフォームで表示する 裏 その他のベンチャーの連合チームで見た目からどうするかは考えものだ。
と思いを何らかの方法など アクの または 男 での道のりですが、カップルのなくてはならない事がいくつかの具体例として:
の基本的な前提とするプラッシュは別のスレッドをすること。そういう無駄のないアクの図ので、私は最も馴染みます。Iを認識していなかったのVB機能だ。ともっこ VB 図書館を、その権利--すべてIL。その場で感じ 汚れ すべてではないこと!:)私はたいと思っていることからVBスに別々のスレッドがオーバーライドまたは作成するスパイラルは--あの研究。
と仮定して作成する別のスレッドで表示されるスプラッシュしようと思うでしょうご注意のスレッドのUIです。を持って行くことがで更新します。基本的には、安全を呼出す必要があります。更新機能を作成してください)はスプラッシュ形式を用に限ります。通過することに権限を委譲 呼び出し 機能プラッシュ画面のフォームオブジェクトです。実際にお問い合わせいただいた場合のスプラッシュ形式で直接更新の進捗/UI要素についても、例外を提供しま走っています。純2.0CLR.経験則として、ブランチ、UI要素の形更新するには長い年月が必要になスレッドを作成したそうです。呼び出しで済む.
最後に、私がオのスプラッシュ(使用していない場合はト過負荷)のmainメソッドのコードです。私はこのようにメインフォームを作成のオブジェクトにも結合します。だが、思いをシンプルなインターフェイスのスプラッシュ画面を実装し--のようなものIStartupProgressListener--受け取り開始進行の更新を介して会員機能です。このためのスワップin/outいずれかのクラス、必要があると認めるときはく離のコードです。スプラッシュ形式で培ったノウハウがありそのものの場合に通知が起動は完了です。
一番簡単なやり方は、こんな感じでとしてのmain():
<STAThread()> Public Shared Sub Main()
splash = New frmSplash
splash.Show()
' Your startup code goes here...
UpdateSplashAndLogMessage("Startup part 1 done...")
' ... and more as needed...
splash.Hide()
Application.Run(myMainForm)
End Sub
きます。純CLR開始のご応募を成形することができます。'main'のスレッド開始を実行本()このthread.ます。Run(myMainForm)には二つのこと:
- 開始ディレクトリーメッセージポンプ'を使用し、スレッドは実行中のmain()のGUIスレです。
- 指定の"主力形式として、"停止フォームのための願います。場合、ユーザーを閉じることを願います。Run()が終了し、制御を返しますおmain()ができず停止しています。
する必要がない産卵のスレッドのスプラッシュウィンドウがこもっていったということと、そのように使用糸-安全技術の更新スプラッシュの内容から主要().
が必要な場合は他のスレッドな背景事業におけで産卵し().とを覚えておいてくださいを設定します。IsBackgroundをTrueにしていくことにより、金型がメイン/GUIスレッドは終了します。の多い国なので、普段から手配を終了すべてのその他のスレッドを自分で持ちでお申込の存在がないGUI)時のメインスレッドは終了します。
私の記事が掲載されるスプラッシュ画像の取り込書へのcodeproject.ので下記からダウンロードがご利
private void MainForm_Load(object sender, EventArgs e)
{
FormSplash splash = new FormSplash();
splash.Show();
splash.Update();
System.Threading.Thread.Sleep(3000);
splash.Hide();
}
私はこのインターネットからのどこかで出できないよう設定することができます。がまだ有効になります。
私のようなアクの回答が多く、そのコードC#3.0以降を使用するラムダ機能です。人を使用する必要がのマネージC#コードで記述2.0、こちらのコードを用い匿名の委譲の代わりにラムダ機能です。必要な最winformという formSplash
と FormBorderStyle = None
.の TopMost = True
パラメータの形式が重要なので、スプラッシュ画面にあるようでしばらくすると消えればよいの一番上.も選べる StartPosition=CenterScreen
ように見えるなどのプロのアプリがどのようなプラッシュ画面になります。したい場合にもクーラー効果で利用できます TrasparencyKey
財産を不規則な形状のスプラッシュ画面になります。
private void formMain_Load(object sender, EventArgs e)
{
Hide();
bool done = false;
ThreadPool.QueueUserWorkItem(delegate
{
using (formSplash splashForm = new formSplash())
{
splashForm.Show();
while (!done)
Application.DoEvents();
splashForm.Close();
}
}, null);
Thread.Sleep(2000);
done = true;
Show();
}
私は国立大学志望の浪人生で、その他の回答を提案 WindowsFormsApplicationBase
.私の経験なのですが、ゆっくりできる自アプリです。正確な運行のお申込フォームのコンストラクタを並列にスプラッシュ画面で延期のお申込フォームの表示イベントです。
ついて検討するアプリ(無splashs画面)を取るコンストラクタで1秒およびイベントハンドラに示す2秒です。このアプリは使用後3秒です。
しかしインストールするプラッシュ画面を利用 WindowsFormsApplicationBase
.と思いますが MinimumSplashScreenDisplayTime
3秒は良いスアプリです。もので、アプリ、今こそ5秒負荷時のものです。
class App : WindowsFormsApplicationBase
{
protected override void OnCreateSplashScreen()
{
this.MinimumSplashScreenDisplayTime = 3000; // milliseconds
this.SplashScreen = new Splash();
}
protected override void OnCreateMainForm()
{
this.MainForm = new Form1();
}
}
や
public Form1()
{
InitializeComponent();
Shown += Form1_Shown;
Thread.Sleep(TimeSpan.FromSeconds(1));
}
void Form1_Shown(object sender, EventArgs e)
{
Thread.Sleep(TimeSpan.FromSeconds(2));
Program.watch.Stop();
this.textBox1.Text = Program.watch.ElapsedMilliseconds.ToString();
}
結論:使用しない WindowsFormsApplicationBase
例えばシェアする画面でユーザーはハンドラのSlownイベントです。きより良いコードとされるスプラッシュを並列にコンストラクタの表示イベントです。
実際にmutlithreadingここには必要ありません。
うにビジネスロジックイベントを生成しますいつ更新したいスプラッシュ画面になります。
せフォームの更新のスプラッシュ画面にその方法を虜になるeventhandler.
との差別化を更新するか、火災の異なるイベントまたはデータを提供するクラスから継承されたEventArgs.
このようにできても変化するスプラッシュ画面になmultithreadingます。
実際のとこまでも支援は、例えば、gif画像をスプラッシュ。するために、仕事、電話ます。DoEvents()をハンドラ:
private void SomethingChanged(object sender, MyEventArgs e)
{
formSplash.Update(e);
Application.DoEvents(); //this will update any animation
}