2012-01-14 23 views
5

Tôi thực hiện một số kiểm tra về tải biểu mẫu, nhưng nó đang khóa biểu mẫu trong một khoảng thời gian (một vài nghìn giây). Vì lý do này, tôi muốn hiển thị một thông báo như "tải ứng dụng ..", nhưng tôi không có ý tưởng làm thế nào tôi làm điều này. Tôi hy vọng điều này rõ ràng! Bất kỳ trợ giúp là rất đánh giá cao. Cảm ơn trước.Làm cách nào để hiển thị nội dung nào đó như "đang tải .." trong khi tôi thực hiện một số kiểm tra về tải biểu mẫu?

Trả lời

10

Lý tưởng nhất là những gì bạn muốn làm là thực hiện các kiểm tra của bạn trên một chuỗi nền, sao cho chuỗi giao diện người dùng không bị chặn. Hãy xem lớp BackgroundWorker.

Bạn nên móc kiểm tra của mình vào sự kiện DoWork của nhân viên nền và gọi phương thức RunWorkerAsync() của BackgroundWorker từ sự kiện Form_Load để bắt đầu công việc nền.

Something như thế này (lưu ý, đây là chưa được kiểm tra):

BackgroundWorker bw = new BackgroundWorker(); 
public void Form_Load(Object sender, EventArgs e) { 
    // Show the loading label before we start working... 
    loadingLabel.Show(); 
    bw.DoWork += (s, e) => { 
     // Do your checks here 
    } 
    bw.RunWorkerCompleted += (s, e) => { 
     // Hide the loading label when we are done... 
     this.Invoke(new Action(() => { loadingLabel.Visible = false; })); 
    }; 
    bw.RunWorkerAsync(); 
} 
+0

Perfect. Cảm ơn rất nhiều. ;) –

2

Bạn có thể tạo một thread để hiển thị thông điệp tải.

Trước tiên, bạn cần một bool.

bool loading = true; 

Tạo một sợi như:

Thread myThread = new Thread(new ThreadStart(Loading)); 
myThread .Start(); 

Sau đó, có một phương pháp:

private void Loading() 
{ 
    while(loading) 
    { 
     //Display loading message here. 
    } 
} 

Khi bạn đang thực hiện tải bất cứ điều gì chỉ cần đặt tải false và lốp sẽ chấm dứt.

+0

Chuỗi giao diện người dùng của bạn sẽ vẫn bận trong vòng lặp, nó sẽ không thể hiển thị bất kỳ ứng dụng annd nào sẽ đóng băng –

+0

Không. Đó là điểm của sợi chỉ. – Axis

2

Hãy xem thành phần BackgroundWorker. Bạn không cần bất kỳ kiến ​​thức luồng nào cả.

2

Điều này có thể được thực hiện dễ dàng bằng cách hiển thị biểu mẫu riêng được thực hiện trên một chuỗi khác. Trong biểu mẫu này (gọi nó là frmSplash), bạn có thể đặt một gif động hoặc văn bản tĩnh. Mã bạn sẽ cần như sau trong biểu mẫu chính của bạn:

Khai báo một số biến sau lớp học.

public partial class frmMain : Form 
{ 
    public Thread th1; 
    static frmSplash splash; 
    const int kSplashUpdateInterval_ms = 1; 

// Rest of code omitted 

Sau đó thêm phương thức sau vào biểu mẫu chính của bạn. Điều này bắt đầu màn hình splash:

static public void StartSplash() 
{ 
    // Instance a splash form given the image names 
    splash = new frmSplash(kSplashUpdateInterval_ms); 

    // Run the form 
    Application.Run(splash); 
} 

Tiếp theo, bạn cần một phương pháp để đóng màn hình splash:

private void CloseSplash() 
{ 
    if (splash == null) 
     return; 

    // Shut down the splash screen 
    splash.Invoke(new EventHandler(splash.KillMe)); 
    splash.Dispose(); 
    splash = null; 
} 

Sau đó, trong Form tải chính của bạn, làm điều này:

private void frmMain_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     Thread splashThread = new Thread(new ThreadStart(StartSplash)); 
     splashThread.Start(); 

     // Set the main form invisible so that only the splash form shows 
     this.Visible = false; 

     // Perform all long running work here. Loading of grids, checks etc. 
     BindSalesPerson(); 
     BindCustomer(); 
     BindBrand(); 

     // Set the main form visible again 
     this.Visible = true; 
    } 
    catch (Exception ex) 
    { 
     // Do some exception handling here 
    } 
    finally 
    { 
     // After all is done, close your splash. Put it here, so that if your code throws an exception, the finally will close the splash form 
     CloseSplash(); 
    } 

} 

Sau đó, nếu biểu mẫu chính bị đóng, hãy đảm bảo màn hình giật gân của bạn cũng đóng:

Mã cho hình thức Splash (Trong frmSplash.cs) như sau:

public partial class frmSplash : Form 
{ 

    System.Threading.Timer splashTimer = null; 
    int curAnimCell = 0; 
    int numUpdates = 0; 
    int timerInterval_ms = 0; 

    public frmSplash(int timerInterval) 
    { 
     timerInterval_ms = timerInterval; 

     InitializeComponent(); 
    } 


    private void frmSplash_Load(object sender, EventArgs e) 
    { 
     this.Text = ""; 
     this.MaximizeBox = false; 
     this.MinimizeBox = false; 
     this.ControlBox = false; 
     this.FormBorderStyle = FormBorderStyle.None; 
     this.Menu = null; 
    } 

    public int GetUpMilliseconds() 
    { 
     return numUpdates * timerInterval_ms; 
    } 

    public void KillMe(object o, EventArgs e) 
    { 
     //splashTimer.Dispose(); 

     this.Close(); 
    }   
} 

Tôi hy vọng điều này sẽ giúp bạn. Nó có thể không phải là mã tốt nhất từng viết, nhưng nó đã làm việc cho tôi.

0

Bạn cần phải tạo một biểu mẫu tải ở đây .. bạn cần phải tạo đối tượng của biểu mẫu đó và được gọi bằng cách sử dụng khái niệm luồng ..và trong FrmLoading đặt một Picturebox và đặt hình ảnh .gif trong đó.

FrmLoading f2 = new FrmLoading(); 
using (new PleaseWait(this.Location,() =>MethodWithParameter())) {  f2.Show(this); } 
f2.Close(); 

Như được hiển thị ở trên mã bạn cần tạo lớp PleaseWait.

PleaseWait.cs

public class PleaseWait : IDisposable 
{ 
private FrmLoading mSplash; 
private Point mLocation; 

public PleaseWait(Point location, System.Action methodWithParameters) 
{ 
    mLocation = location; 
    Thread t = new Thread(new ThreadStart(workerThread)); 
    t.IsBackground = true; 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
    methodWithParameters(); 
} 
public void Dispose() 
{ 
    mSplash.Invoke(new MethodInvoker(stopThread)); 
} 
private void stopThread() 
{ 
    mSplash.Close(); 
} 
private void workerThread() 
{ 
    mSplash = new FrmLoading(); // Substitute this with your own 
    mSplash.StartPosition = FormStartPosition.CenterScreen; 
    //mSplash.Location = mLocation; 
    mSplash.TopMost = true; 
    Application.Run(mSplash); 
} 
} 
Các vấn đề liên quan