سؤال

أنا أستخدم شاشة البداية من هنا. وبعد أنا أحب كم هو بسيط. ولكن المشكلة معها هي أن شاشة البداية لا تذهب بعيدا حتى النقر فوقه. عند تشغيل داخل IDE، فإنه يعمل بشكل جيد. أيه أفكار؟ أود أن أرفق الكود هنا ولكن ليس إدراجها بشكل صحيح لسبب ما.

private System.Windows.Forms.Timer timer1;
//private Splash sp=null;

public Form1()
{
    InitializeComponent();

    Thread th = new Thread(new ThreadStart(DoSplash));
    //th.ApartmentState = ApartmentState.STA;
    //th.IsBackground=true;
    th.Start();
    Thread.Sleep(3000);
    th.Abort();
    Thread.Sleep(1000);
}

private void DoSplash()
{
    Splash sp = new Splash();
    sp.ShowDialog();
}

private void timer1_Tick(object sender, System.EventArgs e)
{
//      sp.Close();
}
هل كانت مفيدة؟

المحلول

بادئ ذي بدء، طريقة شاشة البداية في تلك الصفحة، باستخدام thread.abort., ، يكون ليس الطريقة الصحيحة للقيام بالأشياء.

لا تتصل أبدا thread.abort., ، ما لم تكن في عملية إغلاق appdomain. يعيش الخيط في.

اسمحوا لي أن أؤكد التأكيد على ذلك للتأكيد. المرة الوحيدة التي يجب عليك الاتصال بها thread.abort. هو عندما تعرف ما يكفي thread.abort. وكيف يتصرف أن يعرف أنك يجب ألا تسميه أبدا.

إلقاء نظرة على هذا السؤال الآخر على Stackoverflow: شاشة البداية متعددة الخيوط في C #؟.


إذا كنت ترغب في الاحتفاظ بالحل الحالي الخاص بك، فسيكون طريقة أفضل محتملة لإسقاط مؤقت في نموذج شاشة البداية، واضبط مؤقتها بوقت تريد شاشة البداية للبقاء على الشاشة، والاتصال يغلق في معالج أحداث القراد.

في نفس المكان، سأطلق النار ببساطة عن هذا الموضوع الأصلي، وإزالة الخطوط الأخرى.

بمعنى آخر، من كتلة التعليمات البرمجية الأولى في تلك الصفحة، وأود أن أبقي هذين السطرين:

Thread th = new Thread(new ThreadStart(DoSplash));
th.Start();

زوجين أنه مع هذا الموقت على النموذج الذي يجعل شكل الإغلاق الذاتي، وأنت في طريق أفضل شكل أفضل من محاولة الحصول على السيطرة مع Thread.Abort.

الذي يجب أن لا تتصل.

نصائح أخرى

يجب أن يدعو dosplash sp.Show() بدلا من sp.ShowDialog()

ولكن استدعاء النوم (x000) تشكل مؤشر ترابطك الرئيسي لإظهار شاشة البداية غير فعالة للغاية، ويجب حجز الخيط. القابضة () للاستخدام بشكل أفضل أيضا.

النهج الأفضل هو إغلاق Splashform الخاص بك مع مؤقت وتعيين الحد الأدنى من التأخير. عند بدء التشغيل، يمكنك إظهار () وتحديث () SPLAHFORM ومتابعة تحميل الأشياء. لن ينطلق حدث Timer حتى يتم الانتهاء من التهيئة الرئيسية للهواء وإدخاله. لا يلزم أي مواضيع، ولا يجب أن يشارك MainForm أيضا.

فقط لتعطيك المكونات الرئيسية ل SPLASPForm مدفوعة Messageloop:

public partial class SplashForm : Form
{
    //  default stuff

    public static void Splash()
    {
        var s = new SplashForm();
        s.Show();
        s.Update();// force paint
    }

    private void SplashForm_Load(object sender, EventArgs e)
    {
        Timer t = new Timer();
        t.Interval = 1; // wait for EventLoop
        t.Tick += GoAway;
        t.Enabled = true;
    }

    private void GoAway(object sender, EventArgs e)
    {
        this.Close();
    }
}

ثم، في البرامج

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SplashForm.Splash();
Application.Run(new MainForm());

هذا تنفيذ قبيح. يجب عليك التحقق من هذا موضوع جدا.. وبعد يصف كيفية استخدام مساحة الاسم VisualBasic.net من C # و oncreateSplashscreen. طريقة للقيام بتنفيذ شاشة البداية نظافة كبيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top