2012-01-04 58 views
9

Chương trình của tôi thực hiện tác vụ trên không gian trống trên đĩa cứng. Nhiệm vụ khá dài, phải mất 1-2 giờ.Làm thế nào để ngăn chặn chương trình Windows khỏi ổ đĩa cứng quay xuống?

Sự cố là trên máy tính xách tay, đĩa cứng có thể bị tắt sau vài phút khi người dùng không hoạt động.

Làm cách nào để ngăn chặn Windows khỏi ổ đĩa cứng quay xuống (tắt nguồn)?

+4

Đặt kế hoạch nguồn khác từ bảng điều khiển theo cách thủ công. Tôi sẽ xóa một chương trình thay đổi kế hoạch điện đằng sau lưng tôi. – kludg

+10

Máy tính có thể tắt đĩa khi đang sử dụng? Điều đó thực sự không đúng với tôi. Bạn có chắc không? –

+0

Tóm lại, các cửa sổ sẽ không tắt nguồn đĩa trong khi ghi đĩa đang hoạt động, nhưng OP không thực hiện đọc tập tin hoặc ghi tập tin thích hợp, và do đó Windows có thể tạm dừng đĩa hoặc toàn bộ máy tính. OP có thể hơi sai nêu rõ vấn đề. –

Trả lời

9

Để ngăn hệ thống vào chế độ chờ, bạn có thể thử sử dụng chức năng SetThreadExecutionState. Hàm này thông báo cho hệ thống rằng ứng dụng đang được sử dụng và cho phép bạn chỉ định các yêu cầu thực hiện của luồng. Việc sử dụng có thể như thế này, nhưng tôi không chắc chắn nếu điều này cũng ảnh hưởng đến sức mạnh đĩa xuống timer:

type 
    EXECUTION_STATE = DWORD; 

const 
    ES_SYSTEM_REQUIRED = $00000001; 
    ES_DISPLAY_REQUIRED = $00000002; 
    ES_USER_PRESENT = $00000004; 
    ES_AWAYMODE_REQUIRED = $00000040; 
    ES_CONTINUOUS = $80000000; 

function SetThreadExecutionState(esFlags: EXECUTION_STATE): EXECUTION_STATE; 
    stdcall; external 'kernel32.dll' name 'SetThreadExecutionState'; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED or 
    ES_AWAYMODE_REQUIRED) <> 0 then 
    try 
    // execute your long running task here 
    finally 
    SetThreadExecutionState(ES_CONTINUOUS); 
    end; 
end; 

Hoặc cũng có sẵn các thiết lập mới các chức năng PowerCreateRequest, PowerSetRequestPowerClearRequest được thiết kế cho Windows 7, nhưng tài liệu là khó hiểu và tôi đã không tìm thấy bất kỳ ví dụ về cách sử dụng của họ tại thời điểm này.

Hoặc bạn có thể sửa đổi cài đặt nguồn theo các chức năng PowerWriteACValueIndex hoặc PowerWriteDCValueIndex với nhóm phụ số cài đặt nguồn GUID_DISK_SUBGROUP.

+0

Cảm ơn, – user382591

+0

Bạn được chào đón.Bất cứ điều gì bạn đã sử dụng, ví dụ mã từ bài đăng? Điều đó có nghĩa là 'SetThreadExecutionState' cũng ảnh hưởng đến việc đặt lại bộ đếm thời gian xuống đĩa? khá yếu (và tôi muốn xóa các lưu ý về _untested_), đó là lý do tại sao tôi hỏi :) Cảm ơn – TLama

+1

Tôi đã thử nghiệm nó. Điều đó hoạt động như một nét duyên dáng ... SetThreadExecutionState cũng ảnh hưởng đến việc đặt lại bộ đếm thời gian tắt nguồn của đĩa. – user382591

5

Windows không cho phép ứng dụng vô hiệu hóa thay đổi điều khiển công suất do ứng dụng lỗi đã khiến pin cạn kiệt. Xem http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

Bạn có thể được thông báo khi trạng thái nguồn hệ thống sắp được thay đổi. Xem WM_POWERBROADCAST Messages.

+1

Nhưng bạn có thể nói với hệ thống bạn cần thêm thời gian cho công việc của bạn (ví dụ khi bạn đang xem phim bạn phải nói với hệ thống bạn không muốn tắt màn hình), và IMHO đó là những gì (như TLama nói trong bình luận của mình) hàm 'SetThreadExecutionState' cho. Vì vậy, trong thực tế, bạn đang phá vỡ kế hoạch quyền lực. –

+0

@Martin, như bạn đã đề cập xem phim bạn có thể sử dụng ['SetThreadExecutionState'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29. aspx) với cờ 'ES_DISPLAY_REQUIRED' để giữ màn hình của bạn bật. Vấn đề là tôi không chắc chắn (và không có một máy thử nghiệm) nếu chức năng này được áp dụng cũng cho bộ đếm thời gian rảnh rỗi đĩa. – TLama

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