2009-02-26 16 views
6

लंबे Exec .NET 3.5 स्थापित करने की है, और बाहर स्क्रिप्ट यह एक बंद आधारित है: http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/एक लंबे एक्सेल प्रदर्शन करते समय आप इनो सेटअप को जमे हुए क्यों नहीं देखते हैं?

समस्या यह है कि यह उपयोग कर रहा है "ewWaitUntilTerminated" क्योंकि हम बाहर निकलने के कोड पर कब्जा करने की जरूरत है। यह इस तथ्य से थोड़ा और खराब हो गया है कि हम इसे निष्क्रिय/निष्क्रिय/चल रहे हैं ताकि उपयोगकर्ता के हिस्से पर कम काम हो (शायद हमें नहीं चाहिए?)

सबसे आसान विकल्प जो मैं सोच सकता हूं वह छिपाना है खिड़की जबकि यह .NET स्थापित कर रहा है और इसे पूरा करने के बाद इसे फिर से दिखा रहा है, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।

आदर्श समाधान एक प्रगति पृष्ठ दिखाना होगा, लेकिन ऐसा लगता है कि यह संभव नहीं होगा क्योंकि हमें तुरंत वापस लौटना होगा, लेकिन प्रक्रिया को बाहर निकलने और निकालने पर प्रक्रिया को किसी भी तरह से अधिसूचित किया जाएगा अन्यथा हम सिर्फ एक शाश्वत प्रगति पट्टी होगा।

इस बारे में कोई विचार कैसे है?

संपादित करें: न्यूनतम बनाना शायद बेहतर होगा, लेकिन यह सुनिश्चित नहीं है कि यह कैसे करें। हम उपयोगकर्ता को सूचित करते हुए एक संदेश प्रदर्शित करते हैं कि प्रक्रिया में 10-20 मिनट लग सकते हैं, हालांकि समस्या यह है कि मुख्य सेटअप फॉर्म पूरी तरह जमे हुए है, इसे स्थानांतरित नहीं कर सकता है, इसे कम या कम कर सकता है। .NET इंस्टॉलर को चलाना/निष्क्रिय करना वास्तव में एक धीमी मशीन पर एक अच्छा मिनट या दो के लिए कोई प्रगति नहीं दिखाता है।

+0

बस एक दोपहर एक ऐप के डेमो को स्थापित करने के बाद जो मुझे चेतावनी देकर शुरू नहीं हुआ था कि यह पहले अनिवार्य रीबूट के बाद .NET 3.5 चाहता है ... बस यह कहें कि उपयोगकर्ता अनपेक्षित लंबे समय तक स्पर्श कर सकते हैं उप इंस्टॉल। हालांकि, मेरे पास तकनीकी जवाब नहीं है। – RBerteig

+0

फिर .NET को रीबूट की भी आवश्यकता होती है, जिसके बाद मूल ऐप का सेटअप लंबे समय से भूल गया था, और इसे मैन्युअल रूप से एक अस्थायी फ़ोल्डर में पाया जाना था और वास्तव में एप्लिकेशन इंस्टॉल करने के लिए पुनः चलाया जाना था। – RBerteig

+0

हाँ, हम उस उपयोगकर्ता को सूचित करते हैं और ढांचे को स्थापित करने से पहले उन्हें रद्द करने की अनुमति देते हैं, और हम .net इंस्टॉलर के रीबूट को दबाते हैं और इसे रीबूट करने के लिए रिटर्न कोड में कैप्चर करते हैं – Davy8

उत्तर

0

हम एक जोड़े के उत्पादों के साथ नेट स्थापित करने के लिए आवश्यक है, और दो दृष्टिकोण ले लिया है:

  • जब InnoSetup साथ .NET स्थापित करने, हम जानते हैं कि उपयोगकर्ता स्थापना में लंबा समय लग जाएगा, और जब यह पूरा हो जाए तो एक निश्चित संदेश की उम्मीद करें
  • हम क्लाइंट को इसके माध्यम से मजबूर करने के लिए किसी भी झंडे के बिना .NET सेट अप शुरू करते हैं। इस तरह अगर वे और अधिक तकनीकी रूप से तैयार कर रहे हैं वे जानते हैं कि क्यों स्थापित इतने लंबे समय

हम ईमानदारी से 2 विकल्प के साथ बेहतर भाग्यशाली रहे हैं, विशेष रूप से अब है कि और अधिक प्रणाली व्यवस्थापक को लॉक करने लगते हैं एक निश्चित करने के लिए डेस्कटॉप ले जा रहा है डिग्री।

+0

हाँ, हम वर्तमान में पहले दृष्टिकोण का उपयोग कर रहे हैं, और दूसरे पर विचार कर रहे हैं, लेकिन सोच रहे हैं कि बेहतर समाधान – Davy8

2

हालांकि यह संभवतः आसान होगा, मैं नेट इंस्टॉलर चलाते समय अपने इंस्टॉलर को छिपाने की अनुशंसा नहीं करता हूं। मैंने देखा है कि अन्य इंस्टॉलर ऐसा करते हैं, और जब ऐसा होता है, मुझे लगता है कि इंस्टॉलेशन समाप्त हो गया है, और फिर मुझे उलझन में आता है जब मुझे लगता है कि यह वास्तव में नहीं है। (और जब इंस्टॉलेशन वास्तव में समाप्त हो जाता है, तो मैं इसके बारे में निश्चित नहीं हो सकता। शायद

आप इनो सेटअप विज़ार्ड में कस्टम पेज प्रदर्शित कर सकते हैं। ऐसा पृष्ठ बनाना एक प्रगति पट्टी दिखाता है और इसे सटीक रखना शायद एक चुनौती होगी, लेकिन कम से कम आप विज़ार्ड पेज पर एक संदेश प्रदर्शित कर सकते हैं जिसमें कहा गया है कि आपका इंस्टॉलर आगे बढ़ने से पहले नेट इंस्टॉलर की प्रतीक्षा कर रहा है। सहायता फ़ाइल के "कस्टम विज़ार्ड पेज का उपयोग करना" अनुभाग देखें।

+0

हमारे पास ऐसा कुछ है जो कि, हालांकि, Exec एक ही थ्रेड पर चल रहा है, इसलिए उपयोगकर्ता सेटअप फॉर्म के साथ स्थानांतरित करने, आकार बदलने, कम करने या कुछ भी करने में असमर्थ है। – Davy8

+0

(मैंने व्यक्तिगत रूप से सोचा कि यह ठीक था, लेकिन मेरे मालिक ने इसके बारे में शिकायत की और जोर दिया कि यह अस्वीकार्य था) – Davy8

+1

@ डेवी 8: आपकी पहली टिप्पणी पूरी तरह से सच नहीं है - यह एक ही थ्रेड पर चल रही है, लेकिन एप्लिकेशन। प्रोसेस मैसेज() को कॉल किया जाता है। विज़ार्ड फॉर्म हालांकि अक्षम है, इसलिए चल रहा है, आकार बदलना आदि संभव नहीं है। – mghie

2

आप बस

WizardForm.Hide; 
Exec(...); 
WizardForm.Show; 

बुला हालांकि मैं मानता हूँ कि यह वास्तव में सुंदर नहीं है द्वारा संस्थापक जादूगर प्रपत्र छुपा सकते हैं।

0

प्रश्न पूछने के बाद से 5 साल हो गए हैं, लेकिन यहां मेरा जवाब वैसे भी है।

Exec() आप संदेश है कि इस तरह मुख्य प्रगति पट्टी के ऊपर Inno सेटअप द्वारा दिखाया जाएगा निर्धारित कर सकते हैं कॉल करने से पहले:

WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...'; 
+0

है या नहीं, इसके अलावा कि आप [मार्की प्रगति पट्टी भी दिखा सकते हैं]] (http://stackoverflow.com/a/20753218/960,757)। इसके अलावा, आपको 'StatusLabel' के कैप्शन को स्टोर करना चाहिए और इसे बदलते समय इसे पुनर्स्थापित करना चाहिए। – TLama

7

एक InnoSetup बनाने "स्थिर नहीं लग" जिस तरह एक जोड़ने के लिए है "नकली" प्रगति संकेतक, एक मार्की की तरह, यह दिखाने के लिए कि कुछ चल रहा है। लेकिन यह "खिड़की खींचने योग्य/चलने योग्य" समस्या को हल नहीं करेगा।

तो, एक और तरीका है, जबकि एक लंबी चलने वाली प्रक्रिया निष्पादित किया जाता है, वास्तव में InnoSetup जीयूआई नरम कर देना करने के लिए है:

"लंबे समय से चल रहा है इस प्रक्रिया को" ShellExecuteEx के माध्यम से क्रियान्वित किया जाता है()। फिर संस्थापक हालत WaitForSingleObject और एक बहुत ही कम से कम समय समाप्ति AppProcessMessage पर अमल करने के साथ थोड़ी देर के पाश का उपयोग करता है।

AppProcessMessage अपने आप में एक सहायक कार्य है। यह एक "Application.ProcessMessages" -ish प्रक्रिया पुनः बनाना, WinAPI समारोह PeekMessage(), TranslateMessage() और DispatchMessage() का उपयोग कर "सामान्य" कोड का उपयोग करता है। इसका काम इनोसेटअप जीयूआई को संदेश पंप होना है।

यह चाल विंडो को उत्तरदायी/खींचने योग्य बनाता है, जबकि पृष्ठभूमि में "लंबी चल रही प्रक्रिया" संसाधित की जाती है।

if ShellExecuteEx(ExecInfo) then 
    begin 
    while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT 
    do begin 
     AppProcessMessage; 
     WizardForm.Refresh(); 
    end; 
    CloseHandle(ExecInfo.hProcess); 
    end; 

unzip.iss निम्नलिखित GIST एक स्टैंडअलोन Unzip Helper for executing 7zip without blocking the InnoSetup GUI के लिए कोड, बिट और AppProcessMessage समारोह के साथ काम करने के लिए टुकड़े सहित शामिल हैं:

यह निष्पादन पाश के लिए स्रोत है।

इस मामले "unzip" में सिर्फ एक उदाहरण है और आप जो कुछ भी, एक नेट संस्थापक या किसी अन्य लंबी चलने कार्य के साथ मार डाला आवेदन बदल सकता है।

+1

यह सही जवाब है! – QbProg

+1

सुंदर, इसके लिए धन्यवाद! – Iguananaut

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