2012-03-13 37 views
5

Tôi đang viết một ứng dụng phải thực hiện một số điều sau: kiểm tra email và phân tích cú pháp chúng để chèn một số dữ liệu vào cơ sở dữ liệu và kết nối với dịch vụ web để kiểm tra trạng thái cho một số hoạt động không đồng bộ. Ngay bây giờ, giải pháp của tôi là một bộ đếm thời gian đơn giản thực hiện các hoạt động này theo lịch được xác định trước: email sau mỗi năm phút và dịch vụ web kiểm tra từng phút (nhưng chúng chỉ được thực hiện nếu có hoạt động đang chờ xử lý, vì vậy phần lớn thời gian Điều này không có gì.)Phát hiện hoạt động của người dùng thấp và kiểm tra email trên nền

Ngay bây giờ tôi không sử dụng một chủ đề cho điều này (tôi đang ở giai đoạn phát triển.) Nhưng kế hoạch của tôi là tạo ra một chủ đề nền và để cho nó làm việc offline.

Vài câu hỏi:

  1. tôi có kế hoạch để kiểm soát tất cả mọi thứ trong bộ đếm thời gian (s). Thiết lập một biến toàn cầu (thô sơ "khóa",) bắt đầu chủ đề. Nếu "khóa" đã được đặt, hãy bỏ qua nó. Các chủ đề làm sạch nó lên trên chấm dứt. Tôi có nên sử dụng cơ chế khóa/xếp hàng mạnh mẽ hơn cho chủ đề của mình không? (Tôi đã cài đặt OmniThread)
  2. Làm cách nào để chạy một chuỗi có mức độ ưu tiên thấp? Tôi không muốn ứng dụng cảm thấy chậm chạp khi chuỗi nền đang thực hiện chèn dữ liệu hoặc kết nối mạng.
  3. Có cách nào sạch để xác minh hoạt động của người dùng và chỉ bắt đầu chuỗi này khi người dùng không bận ở bàn phím/chuột không?

Hãy nhớ rằng tôi không có kinh nghiệm về chủ đề. Tôi đã viết một ứng dụng đồng bộ FTP một lần vì vậy tôi không phải là một newbie hoàn chỉnh, nhưng đó là thời gian dài trước đây.

+1

Đây là một ứng dụng cho phép bạn tạo/chỉnh sửa hóa đơn, vv Tuy nhiên, nó cũng cần phải đọc email và phân tích nó để tiêm hoá đơn điện tử kèm theo tài liệu nhận được, và để kết nối với các văn phòng thuế để có được tình trạng hoá đơn nộp . Tôi không muốn làm gián đoạn người dùng cho các hoạt động này vì vậy tôi muốn họ chạy ở chế độ nền. –

+1

Nếu công trình nền của bạn không có sự tương tác trực tiếp với ứng dụng của bạn, tôi sẽ đề nghị sử dụng một dịch vụ riêng biệt (bạn có thể thiết lập nó để ưu tiên thấp nếu bạn muốn) để chạy chúng. Vì vậy, những tác phẩm có thể được xử lý ngay cả khi ứng dụng của bạn được đóng cửa hoặc thậm chí không có người dùng đăng nhập – Justmade

+0

@Justmade -. Tôi muốn có một số thông báo khi có email mới (hoá đơn) đến nơi. –

Trả lời

1
  1. tôi có kế hoạch để kiểm soát tất cả mọi thứ trong bộ đếm thời gian (s). Thiết lập một biến toàn cầu (thô sơ "khóa",) bắt đầu chủ đề. Nếu "khóa" đã được đặt, hãy bỏ qua nó. Các chủ đề làm sạch nó lên trên chấm dứt. Tôi có nên sử dụng cơ chế khóa/xếp hàng mạnh mẽ hơn cho chủ đề của mình không? (Tôi đã cài đặt OmniThread)

Tôi sẽ không bận tâm với Timer.Làm cho vòng lặp của chuỗi của bạn trông như thế này và bạn sẽ có sự chậm trễ của mình. Bạn sẽ KHÔNG cần khóa vì chỉ có một sợi, nó sẽ không ngủ cho đến khi công việc trước đó kết thúc.

procedure YourThread; 
var N: Integer; 
begin 
    while not Terminated do 
    begin 
    // Figure out if there's a job to do 
    // Do the job 

    // Sleep for a while, but give the thread a chance to notice 
    // it needs to terminate. 
    for N := 1 to 500 do 
     if not Terminated then 
     Sleep(100); 
    end; 
end; 
  1. Làm thế nào tôi có thể chạy một sợi với ưu tiên thấp? Tôi không muốn ứng dụng cảm thấy chậm chạp khi chuỗi nền đang thực hiện chèn dữ liệu hoặc kết nối mạng.

Đừng bận tâm. Bạn có thể dễ dàng sử dụng SetThreadPriority nhưng nó không có giá trị rắc rối. Nếu luồng nền của bạn đang chờ I/O (mạng), thì nó sẽ không tiêu tốn bất kỳ tài nguyên CPU nào. Ngay cả khi chuỗi nền của bạn hoạt động với tốc độ tối đa, GUI của bạn sẽ không cảm thấy chậm chạp vì Windows thực hiện tốt công việc tách thời gian CPU sẵn có giữa tất cả các chuỗi có sẵn.

  1. Có cách nào sạch để xác minh cho hoạt động người dùng và bắt đầu chủ đề này chỉ khi người dùng không bận rộn vào bàn phím/chuột?

Một lần nữa, tại sao phải kiểm tra hoạt động của người dùng? Kiểm tra email là mạng (ví dụ: I/O) ràng buộc, thread kiểm tra email sẽ chủ yếu được nhàn rỗi.

+4

ngủ 50 giây trong một thread là một chút trên đầu trang. Hãy nhớ rằng khi thời gian đến để diệt các sợi, ứng dụng sẽ treo trong 50 giây trong trường hợp xấu nhất ... – whosrdaddy

+0

'Hãy nhớ rằng khi thời gian đến để diệt các sợi, ứng dụng sẽ treo trong 50 giây trong điều tồi tệ nhất case '- không phải nếu hệ điều hành giết nó trên ứng dụng gần. Nếu chủ đề được dự kiến ​​sẽ chạy cho đến khi ứng dụng đóng, và bạn không cố gắng chấm dứt và đợi chúng một cách rõ ràng, không có vấn đề gì - ứng dụng sẽ tắt mà không bị chậm trễ. –

+0

đã đồng ý, nhưng chủ đề sống sau khi ứng dụng đóng là ác :) – whosrdaddy

1

Bạn có thể không chỉ làm tất cả điều này trong chuỗi nền, loại bỏ tất cả các chủ đề quản lý vi mô không? Dường như với tôi rằng bạn chỉ có thể vòng quanh một giấc ngủ (60000) gọi trong chủ đề nền. Kiểm tra dịch vụ web mỗi lần vòng lặp, kiểm tra email 5 lần một lần. Bạn có thể thiết lập mức độ ưu tiên cho tpLower, nếu bạn muốn, nhưng thread này sẽ ngủ hoặc bị chặn trên I/O gần như mọi lúc, vì vậy tôi không nghĩ rằng nó thậm chí còn đáng để gõ.

Tôi sẽ ngạc nhiên nếu một chuỗi như vậy là đáng chú ý ở tất cả cho người dùng ở bàn phím/chuột, bất kể khi nào nó chạy.

'Thiết lập biến toàn cầu (thô sơ "khóa",) bắt đầu chuỗi' - biến toàn cục này có ý định làm gì? Có gì để khóa?

+0

Tôi không biết sẽ mất bao lâu để hoàn thành chuỗi này. Vì vậy, nếu TTimer được đặt thành năm phút, lệnh gọi trước đó vẫn có thể hoạt động; đó là lý do tại sao tôi đề cập đến một số hình thức khóa. –

+0

Vì chỉ có một chủ đề nền, nên phần lớn thời gian ngủ có thể hoạt động. Vì vậy, bạn nói điều này là không tốn kém? –

+0

@LeonardoHerrera - nó sẽ ổn thôi. Sử dụng một vòng lặp ngủ giữ chủ đề chính 'ra khỏi nó' - bộ đếm thời gian là không cần thiết. Nếu một hoạt động kéo dài hơn năm phút, nó không quan trọng - một hoạt động mới không thể bắt đầu cho đến năm phút sau khi hoạt động cuối cùng kết thúc. Nếu 'jiter' này là không thể chấp nhận được, nó không khó để lưu trữ một 'lastRun' TdateTime cho khi chạy hoạt động cuối cùng. Một khoảng thời gian sleep() mới sau đó có thể được tính toán sau hoạt động như 'trunc ((now-lastRun) * msecPerDay)'. LƯU Ý: nếu con số này là tiêu cực, không ngủ ở tất cả những người khác bạn sẽ ngủ trong một thời gian rất dài! –

6

Đối với phần 3 của câu hỏi, API Windows có chức năng GetLastInputInfo sẽ trả về thông tin về lần cuối cùng người dùng đã làm điều gì đó. Nó thậm chí còn nói rằng nó là "Chức năng này rất hữu ích cho việc phát hiện nhàn rỗi đầu vào". Tôi đã có kế hoạch sử dụng cái này cho bản thân mình, nhưng chưa có cơ hội để kiểm tra nó.

Edit: Delphi implementation link

+0

Nó hoạt động một cách chính xác (được sử dụng để gọi bảo vệ màn hình, task scheduler nhiệm vụ nhàn rỗi vv) – OnTheFly

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