2012-01-04 15 views
9

मेरा प्रोग्राम हार्ड डिस्क फ्री स्पेस पर एक कार्य करता है। कार्य काफी लंबा है, में 1-2 घंटे लगते हैं।हार्ड डिस्क ड्राइव से विंडोज़ को प्रोग्रामिक रूप से कैसे रोकें?

समस्या यह है कि लैपटॉप पर हार्ड डिस्क को कुछ मिनटों के बाद बंद कर दिया जा सकता है जब उपयोगकर्ता निष्क्रिय होता है।

मैं विंडोज़ को हार्ड डिस्क स्पिन डाउन (पावर ऑफ) से प्रोग्रामेटिक रूप से कैसे रोकूं?

+4

मैन्युअल रूप से नियंत्रण कक्ष से एक अलग पावर योजना सेट करें। मैं एक प्रोग्राम हटा दूंगा जो मेरी पीठ के पीछे बिजली योजना बदलता है। – kludg

+10

कंप्यूटर उपयोग में होने पर डिस्क को कम करता है? यह वास्तव में मेरे लिए सही नहीं है। क्या आपको यकीन है? –

+0

संक्षेप में, विंडोज सक्रिय डिस्क लिखने के दौरान डिस्क को पावर नहीं करेंगे, लेकिन ओपी उचित फ़ाइल-रीड या फ़ाइल-लेखन नहीं कर रहा है, और इसलिए विंडोज डिस्क या पूरे कंप्यूटर को निलंबित कर सकता है। ओपी समस्या को थोड़ा गलत बता सकता है। –

उत्तर

9

सिस्टम को निष्क्रिय मोड में प्रवेश करने से रोकने के लिए आप SetThreadExecutionState फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं। यह फ़ंक्शन सिस्टम को सूचित करता है कि एप्लिकेशन उपयोग में है और आपको थ्रेड की निष्पादन आवश्यकताओं को निर्दिष्ट करने की अनुमति देता है। उपयोग इस तरह हो सकता है, लेकिन मुझे यकीन है कि अगर यह भी प्रभावित करता है डिस्क शक्ति नीचे टाइमर नहीं कर रहा हूँ:

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; 

या वहां भी उपलब्ध है कार्यों PowerCreateRequest, PowerSetRequest और PowerClearRequest विंडोज 7 के लिए बनाया गया के नए सेट, लेकिन दस्तावेज भ्रमित है और मुझे इस समय उनके उपयोग का कोई उदाहरण नहीं मिला है।

या आप PowerWriteACValueIndex या PowerWriteDCValueIndex द्वारा पावर सेटिंग्स को GUID_DISK_SUBGROUP पावर सेटिंग्स के उपसमूह के साथ संशोधित कर सकते हैं।

+0

धन्यवाद। यह है! – user382591

+0

आपका स्वागत है। वैसे भी आपने पोस्ट का कोड उदाहरण क्या उपयोग किया है? क्या इसका मतलब यह है कि 'SetThreadExecutionState' डिस्क पावर डाउन टाइमर को रीसेट करने पर भी प्रभाव डालता है? एमएसडीएन दस्तावेज है काफी कमजोर (और मैं _untested_ के बारे में नोट को हटाना चाहता हूं), यही कारण है कि मैं पूछ रहा हूं :) धन्यवाद – TLama

+1

मैंने इसका परीक्षण किया। यह एक आकर्षण की तरह काम करता है ... SetThreadExecutionState डिस्क पावर डाउन टाइमर को रीसेट करने पर भी प्रभाव डालता है। – user382591

5

विंडोज़ अनुप्रयोगों को पावर नियंत्रण में परिवर्तन अक्षम करने की अनुमति नहीं देता है, क्योंकि छोटी गाड़ी के अनुप्रयोग बैटरी को निकालने के कारण होते हैं। http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

सिस्टम पावर स्थिति बदलने के बारे में सूचित किया जा सकता है जब आप अधिसूचित हो सकते हैं। WM_POWERBROADCAST Messages देखें।

+1

लेकिन आप सिस्टम को बता सकते हैं कि आपको अपने काम के लिए अतिरिक्त समय चाहिए (उदाहरण के लिए जब आप फिल्म देख रहे हों तो आपको उस सिस्टम को बताना होगा जिसे आप डिस्प्ले बंद नहीं करना चाहते हैं), और आईएमएचओ यही है (जैसा कि टीलामा ने कहा था उनकी टिप्पणी में) फ़ंक्शन 'SetThreadExecutionState' के लिए। तो वास्तव में आप बिजली योजना तोड़ रहे हैं। –

+0

@ मार्टिन, जैसा कि आपने फिल्म देखने का उल्लेख किया है, आप ['SetThreadExecutionState'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29 का उपयोग कर सकते हैं। एएसपीएक्स) पर अपना प्रदर्शन रखने के लिए 'ES_DISPLAY_REQUIRED' ध्वज के साथ। समस्या यह है कि मुझे यकीन नहीं है (और एक परीक्षण मशीन नहीं है) यदि यह फ़ंक्शन डिस्क निष्क्रिय टाइमर के लिए भी लागू होता है। – TLama

संबंधित मुद्दे