2009-07-23 8 views
14

Tôi đang cố gắng để có được một bộ đếm thời gian để đánh dấu một lần một giây trong một winform, khi tôi tìm lời khuyên về cách làm điều này tôi tìm thấy rất nhiều thứ về chủ đề. Tôi không quan tâm đến chủ đề, bởi vì tất cả những gì tôi đang cố gắng làm là giảm giá trị từ 60 xuống 0 trong một phút, sau đó dừng lại. Tôi không nghĩ rằng chúng ta cần phải đi vào điện toán đám mây để giải quyết vấn đề này, nhưng tôi thực sự là một biểu mẫu web, vì vậy tôi có chút mệt mỏi về vấn đề này. bất cứ ai có thể chỉ cho tôi một ví dụWinforms Timer for Dummies

Đây là những gì tôi đã cố gắng

private void button1_Click(object sender, EventArgs e) 
    { 
     this.timeLeft = 60; 
     this.label1.Visible = false; 
     this.button1.Visible = false; 
     gt = new Timer(); 
     gt.Tick += new EventHandler(CountDown); 
     gt.Interval = 1000; 
     gt.Start(); 
    } 

private void CountDown(object sender, EventArgs e) 
{ 
    do 
    { 
     this.TimeBar.Value = timeLeft;     
     this.timeLeft -= 1; 
    } while (this.timeLeft > 0); 
    if (this.TimeBar.Value > 0) return; 
    gt.Stop(); 
    this.label1.Visible = true; 
    this.button1.Visible = true; 
} 

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

8

Điều đang xảy ra là bạn đang giảm biến số timeLeft cho đến khi nó đạt đến số không trên dấu tick đầu tiên của bộ hẹn giờ. Đưa ra các vòng lặp do...while và bạn sẽ có một ví dụ làm việc cơ bản.

Tuy nhiên, nếu bạn định làm bất kỳ số lượng Windows Forms nào, bạn cần tìm hiểu về luồng và cách ảnh hưởng đến giao diện người dùng. Bạn sẽ nhanh chóng tìm thấy chính mình trở lại đây nếu bạn không có câu chuyện về ngoại lệ không hữu ích và làm hỏng các thành phần giao diện người dùng. Jon Skeet có một xuất sắc threading series. Tôi khuyên bạn nên nó. Nó có một phần dành cho bộ đếm thời gian, do đó có thể cung cấp cho bạn một số thông tin chi tiết bổ sung.

+0

Và đừng quên tắt hẹn giờ sau khi đếm ngược kết thúc, nếu không bạn sẽ gặp số âm. –

+0

Cảm ơn, nó khá muộn ở đây, tất nhiên tôi không cần vòng lặp, doh! Cảm ơn cũng cho các liên kết đến tài liệu luồng của ông Skeet. :) –

+0

@Martinho - Obligado, yeah rằng một trong những đã cho tôi quá :) –

8

Bạn không cần luồng nếu bạn sử dụng bộ đếm thời gian của winforms.

Thả một điều khiển Timer trên trang của bạn, đặt tên là "hẹn giờ" và dán đoạn mã sau:

public MainForm() 
{ 
    InitializeComponent(); 

    timer.Interval = 1000; 
    timer.Start(); 

    timeLeft = 60; 
    timer.Tick += Timer_Tick; 

    // start things 
    label1.Hide(); 
    button1.Hide(); 
    timer.Start(); 

} 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    timeLeft--; 

    if (timeLeft <= 0) { 
     timer.Stop(); 
     label1.Show(); 
     button1.Show(); 
    } 
} 

Tôi cho rằng nếu bạn đã đến từ một nền Webby, lập trình sự kiện-driven có lẽ là điều bạn cần phải bắt đầu đọc về nếu bạn muốn hiểu cách thức các công cụ trên máy tính để bàn được lập trình.

+0

Cảm ơn, yeah điều luồng chỉ là tiếng ồn, tôi đã có nó được sắp xếp bây giờ, nhưng tôi cũng đã có một số con trỏ đọc tốt. –

2

Bạn không muốn thực hiện bất kỳ vòng lặp nào trong trình xử lý sự kiện của mình. Trình xử lý được gọi một lần mỗi lần 'đánh dấu' - mỗi 1000 mili giây, như bạn đã định cấu hình nó. Vì vậy, bạn muốn giảm biến số timeLeft một lần cho mỗi cuộc gọi, sau đó tắt toàn bộ nội dung xuống khi số timeLeft không thành công.

// untested 
private void CountDown(object sender, EventArgs e) 
{ 
    this.TimeBar.Value = timeLeft; 
    this.timeLeft--; 
    if (this.TimeBar.Value == 0) 
    { 
     gt.Stop(); 
     this.label1.Visible = true; 
     this.button1.Visible = true; 
    } 
} 
+0

Cảm ơn, chỉ là có một chút phai não, làm một dự án nhỏ cho con gái tôi sử dụng, do TV nghèo ở đây. Mã của bạn là khá nhiều những gì tôi đã kết thúc với. –

3

Ngoài việc rút vòng lặp (theo câu trả lời của jasonh), cách tiếp cận của bạn có thể trở nên không chính xác nếu ứng dụng bận. Mặc dù bạn chỉ định khoảng thời gian của họ tính bằng mili giây, bộ hẹn giờ WinForms có độ phân giải 18 ms và có mức độ ưu tiên rất thấp, vòng lặp tin nhắn chỉ kiểm tra bộ hẹn giờ nếu không tìm thấy gì khác.

Vì vậy, hãy giữ giá trị Thời gian bắt đầu (Ngày giờ) và sử dụng giá trị đó để tính thời gian còn lại trong mỗi sự kiện Bộ hẹn giờ. Bạn chỉ có thể cần 61 đánh dấu để đạt được một phút.

+0

Vâng, bộ đếm thời gian chính xác đến khoảng 55ms tôi đọc. Nó chỉ làm một cái gì đó thực sự tầm thường nên + -3 giây trong một phút sẽ làm, các quá trình khác sẽ không phá vỡ các ngân hàng hoặc. Cảm ơn mặc dù :) –