2009-07-24 35 views
6

tôi sử dụng API SetTimer và tôi thấy rất nhiều mã như thế này:KillTimer có cần thiết không?

case WM_DESTROY: 
    // Destroy the timer. 
    KillTimer(hwnd, IDT_TIMER); 
    PostQuitMessage(0); 
    break; 

Tôi có phải gọi KillTimer hoặc hệ thống sẽ tự động nguồn lực miễn phí trên lối ra quá trình? Không quên gọi KillTimer dẫn đến rò rỉ tài nguyên?

Tôi hiểu rằng nếu bộ hẹn giờ không cần thiết, nó có thể bị hủy bởi KillTimer. Nhưng phải nó bị phá hủy bằng tay?

+0

Tôi đã thực hiện một số nghiên cứu và phát hiện ra: thói quen dọn dẹp Wnen một cửa sổ đang bị hủy hoại được gọi (DestroyWindowsTimers từ xxxFreeWindow cuộc gọi). –

Trả lời

7

Bộ hẹn giờ được đặt từ HWND bị phá hủy hoàn toàn bởi cửa sổ (hwnd) đang bị hủy. Vì vậy, không, bạn không phải làm sạch bộ hẹn giờ của bạn khi cửa sổ thoát.

Nhưng thực tiễn tốt là có tất cả các tài nguyên liên quan đến cửa sổ được dọn dẹp khi đóng cửa sổ.

4

Bộ hẹn giờ sẽ bị Windows tự động hủy khi thoát khỏi quá trình.

Nhưng hãy nhớ rằng (để nó xuất hiện) bộ đếm thời gian của bạn thuộc về cửa sổ, không phải là quá trình. Vì vậy, nếu ứng dụng của bạn cho phép các cửa sổ này được tạo ra và bị phá hủy trong một quá trình, bạn sẽ bị rò rỉ giờ.

Thực hành luôn luôn là tốt để làm sạch mọi thứ một cách rõ ràng, bởi vì nếu không việc dọn dẹp có thể trở lại để cắn bạn sau này.

+0

Tôi không tin điều đó đúng khi nói giờ sẽ bị rò rỉ khi cửa sổ bị phá hủy. Có lẽ trong Windows 95/98 ngày cũ, một bộ đếm thời gian có thể bị rò rỉ. Nhưng chắc chắn trên XP và lên, giờ đặt trên hwnds được làm sạch khi cửa sổ bị phá hủy. – selbie

+2

@selbie: Vâng, tôi chắc chắn bạn đã đúng. Nhưng tôi vẫn nói thực hành tốt là cho rằng mọi thứ sẽ bị rò rỉ trừ khi bạn dọn sạch chúng một cách rõ ràng. Hãy tưởng tượng bạn thay đổi từ các bộ đếm thời gian dựa trên cửa sổ thành các trình dựa trên cuộc gọi lại - sau đó bạn sẽ bị rò rỉ trừ khi bạn giết chúng một cách rõ ràng. – RichieHindle

0

Theo MSDN, ta nên giết giờ:

Ứng dụng nên sử dụng chức năng KillTimer để tiêu diệt giờ mà không còn cần thiết. Ví dụ sau phá hủy bộ hẹn giờ được xác định bởi các hằng số IDT_TIMER1, IDT_TIMER2 và IDT_TIMER3.

// Hủy bộ hẹn giờ.
KillTimer (hwnd, IDT_TIMER1);
KillTimer (hwnd, IDT_TIMER2);
KillTimer (hwnd, IDT_TIMER3);

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644901(v=vs.85).aspx#creating_timer

+0

Có, nhưng nếu bộ đếm thời gian của bạn có cùng tuổi thọ như một cửa sổ, bạn có thể bỏ qua 'KillTimer'. –

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