2009-04-07 29 views
5

Tôi có một ứng dụng cần kích hoạt một vài sự kiện vào những thời điểm nhất định trong ngày - tất cả thời gian đều do người dùng xác định. Tôi có thể nghĩ ra một vài cách để làm điều đó nhưng không ai trong số họ ngồi quá tốt. Thời gian không nhất thiết phải có độ phân giải đặc biệt cao - mỗi phút một lần là tốt.Cách hay để kích hoạt sự kiện vào một thời điểm cụ thể trong ngày?

ý tưởng của tôi:

  1. Khi ứng dụng khởi động đọc tất cả thời gian và bắt đầu tính giờ tắt mà sẽ Tick vào thời điểm thích hợp

  2. Bắt đầu hẹn giờ tắt mà sẽ kiểm tra mỗi phút hoặc vì vậy đối với 'hiện tại sự kiện'

tia để có giải pháp tốt hơn.

Trả lời

4
  • Lưu trữ/lập chỉ mục sự kiện được sắp xếp theo thời điểm cần chú ý tiếp theo. Nếu tất cả các sự kiện của bạn cháy mỗi ngày một lần, danh sách này về cơ bản là một bộ đệm tròn chỉ thay đổi khi người dùng thay đổi các sự kiện của họ.
  • Bắt đầu hẹn giờ sẽ 'đánh dấu' vào thời điểm diễn ra sự kiện ở đầu danh sách. Làm tròn đến phút tiếp theo nếu bạn thích.
  • Khi bộ hẹn giờ kích hoạt, xử lý tất cả các sự kiện hiện đang trong quá trình [sửa - và chưa được xử lý], hãy chèn lại chúng vào danh sách nếu cần thiết (ví dụ: nếu bạn không có "thông tư bộ đệm "tối ưu hóa" và đặt bộ hẹn giờ mới.

Rõ ràng, khi bạn thay đổi tập hợp sự kiện hoặc thay đổi thời gian cho một sự kiện hiện có, bạn có thể cần đặt lại bộ hẹn giờ để kích hoạt trước đó. Thường thì không có điểm nào để thiết lập lại nó sau này - bạn cũng có thể để nó đi và không làm gì cả. Và nếu bạn đặt giới hạn trên một phút trong khoảng thời gian bộ hẹn giờ có thể chạy (hoặc chỉ có bộ định thời 1 phút), thì bạn có thể đạt được độ chính xác trong vòng 1 phút mà không cần phải đặt lại. Điều này về cơ bản là lựa chọn của bạn 2.

Có thể cho rằng bạn nên sử dụng khung hiện có thay vì tự làm khung của mình, nhưng tôi không biết C# vì vậy tôi không biết có gì. Tôi nói chung là một chút cảnh giác với ý tưởng thiết lập các squillions của bộ đếm thời gian, bởi vì một số môi trường không hỗ trợ (hoặc không hỗ trợ nó tốt). Do đó chương trình này, mà chỉ yêu cầu một. Tôi không biết liệu C# có bất kỳ vấn đề nào trong khía cạnh đó hay không, nhưng lược đồ này có thể dễ dàng được sắp xếp để sử dụng O (1) RAM nếu cần, không thể đánh bại được.

+0

Tôi thích cách tiếp cận này quá. – GWLlosa

3

Điều này nghe giống như trường hợp điển hình cho Dịch vụ Windows. Tôi nghĩ rằng có một loại dự án dịch vụ Windows trong VS2005/2008. Dịch vụ này kết hợp với một cơ sở dữ liệu đơn giản và một ứng dụng front-end để cho phép người dùng thiết lập thời gian kích hoạt sẽ là tất cả những gì bạn cần.

Nếu nó không thay đổi thường xuyên, Công việc theo lịch trình cũng là một tùy chọn.

4

Hãy xem Quartz.Net. Nó là một khung lập lịch biểu (ban đầu cho Java).

+0

Chúng tôi sử dụng Quartz trong nhóm của chúng tôi cho Java. Tôi khuyên bạn nên nó. Nó được phát hành theo giấy phép Apache 2.0 (miễn phí để sử dụng, cung cấp tín dụng khi đến hạn) –

1

Tôi đã viết một vài chương trình theo các dòng này.

Tôi đề xuất # 2. Tất cả những gì bạn cần làm là giữ một danh sách các lần các sự kiện là "do" tại và mỗi khoảng thời gian X (tùy thuộc vào độ phân giải của bạn) kiểm tra danh sách của bạn cho các sự kiện "hiện tại". Bạn có thể chọn một số tối ưu hóa nếu bạn có thể đảm bảo danh sách được sắp xếp và mỗi sự kiện trong danh sách sẽ chính xác một lần.Nếu không, nếu bạn có các sự kiện lặp lại, bạn phải đảm bảo rằng bạn đã che cửa sổ của mình. Ý tôi là, nếu bạn có một sự kiện đến hạn vào lúc 11:30 sáng, và bạn đang kiểm tra từng giây, thì có thể bạn có thể kiểm tra lúc 11:29:59, và sau đó không một lần nữa cho đến 11:31: 01, do việc đoán trước các lát thời gian của CPU. Vì vậy, bạn sẽ cần phải chắc chắn rằng một trong những kiểm tra (11:29 hoặc 11:31) vẫn chọn lên các hit 11:30, và chỉ có một trong số họ làm (tức là, bạn không chạy ở cả 11: 29 và 11:31).

Lợi thế cách tiếp cận này chỉ kiểm tra trên những lần bạn biết trong danh sách của bạn là danh sách của bạn được bên thứ ba sửa đổi mà bạn không biết và trình xử lý sự kiện của bạn sẽ tiếp tục 'chỉ hoạt động'.

0

Cách đơn giản nhất có thể là sử dụng bộ lập lịch Windows.

Nếu không, bạn cần phải sử dụng một trong các lớp Timer, tính thời lượng cho đến khi sự kiện đầu tiên diễn ra. Cách tiếp cận này, không giống như trình lập lịch biểu, cho phép các sự kiện mới được tìm thấy bởi quá trình chạy (và, có thể, đặt lại bộ hẹn giờ).

0

Vấn đề với số 1 là số mili giây trước khi sự kiện có thể quá lớn để lưu trữ trong khoảng thời gian của Timer và khi số sự kiện tăng, số giờ của bạn có thể trở nên khó chịu.

Tôi không thấy bất cứ điều gì sai với # 2, nhưng tôi sẽ lựa chọn không cho một nhân viên nền hoặc một sợi.

Các vấn đề liên quan