2009-02-26 20 views
6

Các Exec dài được cài đặt .NET 3.5, và kịch bản ra được dựa trên một điều này: http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/Làm cách nào để thiết lập Inno không bị đóng băng khi thực hiện một Exec dài?

Vấn đề là nó sử dụng "ewWaitUntilTerminated" bởi vì chúng ta cần phải nắm bắt các mã thoát. Nó thực hiện một chút tồi tệ hơn bởi thực tế là chúng tôi đang chạy nó/thụ động/norestart để nó ít hoạt động trên phần của người dùng (Có lẽ chúng ta không nên?)

Tùy chọn đơn giản nhất tôi có thể nghĩ là ẩn cửa sổ trong khi nó đang cài đặt .NET và hiển thị lại sau khi hoàn tất, nhưng tôi không chắc chắn cách thực hiện điều đó.

Giải pháp lý tưởng là hiển thị trang tiến trình, nhưng có vẻ như không thể thực hiện được vì chúng tôi cần trả lại ngay nhưng bằng cách nào đó vẫn được thông báo khi quá trình thoát và nắm bắt mã thoát bằng không chúng ta chỉ có một thanh tiến trình vĩnh cửu.

Bất kỳ ý tưởng nào về cách thực hiện việc này?

Chỉnh sửa: Giảm thiểu có thể tốt hơn, nhưng cũng không chắc chắn cách thực hiện điều đó. Chúng tôi hiển thị thông báo cho người dùng rằng quá trình có thể mất 10-20 phút, tuy nhiên vấn đề là biểu mẫu thiết lập chính hoàn toàn bị đóng băng, không thể di chuyển, thu nhỏ hoặc làm bất cứ điều gì với nó. Cũng chạy/thụ động trình cài đặt .NET không thực sự hiển thị bất kỳ tiến bộ nào cho một hoặc hai phút tốt trên máy chậm hơn.

+0

Chỉ cần dành một buổi chiều cài đặt bản demo của một ứng dụng không bắt đầu bằng cách cảnh báo tôi rằng nó sẽ muốn .NET 3.5 cho đến sau lần khởi động lại bắt buộc đầu tiên ... cho phép người dùng có thể cảm thấy mệt mỏi cài đặt phụ. Tuy nhiên, tôi không có câu trả lời kỹ thuật. – RBerteig

+0

Sau đó, .NET cũng yêu cầu khởi động lại, sau đó thiết lập của ứng dụng gốc từ lâu đã quên nó đang chạy và phải được tìm thấy thủ công trong thư mục tạm thời và chạy lại để cài đặt ứng dụng. – RBerteig

+0

Vâng, chúng tôi thông báo cho người dùng đó và cho phép họ hủy trước khi khung được cài đặt và chúng tôi sẽ chặn khởi động lại trình cài đặt của .net và capture nó trong mã trả lại để thực hiện tự khởi động lại – Davy8

Trả lời

0

Chúng tôi đã cần thiết để cài đặt .NET với một vài sản phẩm, và đã lấy hai phương pháp:

  • Khi cài đặt .NET với InnoSetup, chúng tôi cho phép người dùng biết rằng quá trình cài đặt sẽ mất một thời gian dài, và mong đợi một thông báo nhất định khi nó hoàn thành
  • Chúng tôi bắt đầu thiết lập .NET mà không có bất kỳ cờ nào để buộc khách hàng vượt qua nó. Bằng cách này, nếu họ có nhiều kỹ thuật nghiêng họ biết lý do tại sao cài đặt được dùng để lâu

Chúng tôi thành thật có may mắn hơn với tùy chọn thứ 2, đặc biệt là bây giờ mà các quản trị viên hệ thống hơn dường như khóa máy tính để bàn đến một số trình độ.

+0

Vâng, chúng tôi hiện đang sử dụng cách tiếp cận đầu tiên, và xem xét phương pháp thứ hai, nhưng tự hỏi nếu có giải pháp tốt hơn – Davy8

2

Mặc dù nó có thể dễ dàng, tôi không khuyên bạn nên ẩn trình cài đặt của mình trong khi trình cài đặt .Net chạy. Tôi đã thấy những người cài đặt khác làm điều đó và khi điều đó xảy ra, tôi nghĩ quá trình cài đặt đã hoàn tất, và sau đó tôi thấy bối rối khi tôi thấy rằng nó thực sự không. (Và khi quá trình cài đặt hoàn tất, tôi cũng không thể chắc chắn về điều đó. Có thể nó chỉ ẩn mình một lần nữa.)

Bạn có thể hiển thị các trang tùy chỉnh trong trình hướng dẫn Cài đặt Inno. Làm cho một trang như vậy hiển thị một thanh tiến trình và giữ cho nó chính xác có thể là một thách thức, nhưng ít nhất bạn có thể hiển thị một thông báo trên trang thuật sĩ nói rằng trình cài đặt của bạn đang đợi trình cài đặt .Net trước khi tiếp tục. Xem phần "Sử dụng trang thuật sĩ tùy chỉnh" của tệp trợ giúp.

+0

Chúng tôi có điều gì đó tương tự Exec đang chạy trên cùng một chuỗi, vì vậy người dùng không thể di chuyển, thay đổi kích thước, thu nhỏ hoặc làm bất cứ điều gì với biểu mẫu thiết lập. – Davy8

+0

(cá nhân tôi nghĩ rằng nó là tốt, nhưng ông chủ của tôi phàn nàn về nó và khẳng định nó là không thể chấp nhận) – Davy8

+1

@ Davy8: bình luận đầu tiên của bạn không hoàn toàn đúng - nó đang chạy trên cùng một luồng, nhưng Application.ProcessMessages() được gọi. Tuy nhiên, biểu mẫu trình hướng dẫn bị vô hiệu hóa, vì vậy việc di chuyển, thay đổi kích thước, v.v. là không thể. – mghie

2

Bạn chỉ có thể ẩn dưới dạng thuật sĩ cài đặt bằng cách gọi

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

dù tôi đồng ý rằng điều này là không thực sự xinh đẹp.

0

Đã 5 năm kể từ khi bạn đặt câu hỏi nhưng đây vẫn là câu trả lời của tôi.

Trước khi gọi Exec(), bạn có thể thiết lập được thông báo sẽ được hiển thị bằng Inno Setup trên thanh tiến trình chính như thế này:

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

Ngoại trừ việc bạn cũng có thể ['hiển thị thanh tiến trình marquee] (http://stackoverflow.com/a/20753218/960757). Bên cạnh đó, bạn nên lưu trữ chú thích của 'StatusLabel' và khôi phục lại nó khi thay đổi nó. – TLama

7

Một cách để làm cho InnoSetup "không nhìn đông lạnh" là thêm một chỉ báo tiến trình "giả", giống như vùng chọn, để cho thấy có điều gì đó đang diễn ra. Nhưng điều này sẽ không giải quyết được vấn đề "cửa sổ không kéo được/di chuyển" được.

Vì vậy, một cách khác là để thực sự unfreeze GUI InnoSetup, trong khi một quá trình chạy dài được thực hiện:

Các "quá trình chạy dài" được thực hiện thông qua ShellExecuteEx(). Sau đó, trình cài đặt sử dụng vòng lặp while với điều kiện WaitForSingleObject và hết thời gian chờ tối thiểu để thực hiện AppProcessMessage.

AppProcessMessage chính nó là một hàm trợ giúp. Nó sử dụng mã "chung" để tạo lại thủ tục "Application.ProcessMessages", sử dụng hàm WinAPI PeekMessage(), TranslateMessage()DispatchMessage(). Công việc của nó là trở thành máy bơm thông báo cho giao diện đồ họa InnoSetup.

Bí quyết này làm cho cửa sổ đáp ứng/có thể kéo lại, trong khi "quá trình chạy dài" được xử lý trong nền.

Đây là nguồn gốc cho các vòng thi:

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

Các GIST sau cho unzip.iss chứa mã cho một độc Unzip Helper for executing 7zip without blocking the InnoSetup GUI, bao gồm các bit và miếng để làm việc với các AppProcessMessage chức năng.

Trong trường hợp này "giải nén" chỉ là một ví dụ và bạn có thể thay thế ứng dụng đã thực hiện bằng bất kỳ thứ gì, trình cài đặt .Net hoặc bất kỳ tác vụ chạy dài nào khác.

+1

đây là câu trả lời đúng! – QbProg

+1

Đẹp, cảm ơn vì điều này! – Iguananaut

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