Как добавить таймер обратного отсчета в код InstallScript?

Я создал базовый проект MSI и написал пользовательское действие InstallScript для загрузки файла с сервера. Для этого я использовал функцию CopyFile(). Я также показываю sdShowMsg() во время этой загрузки. Но когда сервер загрузки не отвечает, диалоговое окно sdShowMsg() остается на экране, а фоновая загрузка не происходит. Итак, есть ли способ добавить таймер обратного отсчета, который будет выполнять операцию загрузки только в течение этого периода времени, а затем выходить из нее. Или есть другой способ сначала проверить, отвечает ли сервер загрузки или нет?

SdShowMsg("Please Wait... Downloading file from our server...", TRUE);
CopyFile("https://<downloadURL>/sample.rtf", szEULAFile);
SdShowMsg("Please Wait... Downloading file from our server...", FALSE);

person Ajit Medhekar    schedule 28.05.2018    source источник


Ответы (1)


Вы можете заменить вызов CopyFile внешней командой для загрузки файлов, а затем использовать функцию LaunchApp(), установив тайм-аут. Вот небольшой псевдопример использования powershell (вы также можете использовать curl.exe и многие другие методы для загрузки файлов из командной строки)

nOptions = LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN | LAAW_OPTION_FIXUP_PROGRAM | LAAW_OPTION_SHOW_HOURGLASS;
LAAW_PARAMETERS.nTimeOut = 30000;  // 30 seconds
SdShowMsg("Downloading, please wait...", TRUE);
nResult = LaunchAppAndWait( "powershell", "-Command \"Invoke-WebRequest -Uri https://example.com/sample.rtf -OutFile " + szEULAFile + "\"", nOptions); 
SdShowMsg("", FALSE);
if nResult < 0 then
  // failed to launch, notify the user
elseif (nResult == 5) || (nResult == 259) then
  // timeout reached, notify the user
endif;
person yossiz74    schedule 29.05.2018
comment
Спасибо yossiz74 за это решение. Но здесь одна проблема связана с дочерним процессом. Если я загружаю файл, для которого требуется более 30 секунд, то в этом случае даже после истечения времени ожидания дочерний процесс все еще существует в фоновом режиме. Для этого я использовал флаг LAAW_OPTION_WAIT_INCL_CHILD, но тогда он не учитывает тайм-аут. - person Ajit Medhekar; 29.05.2018
comment
Правильный. Я нашел свой старый проект, где я столкнулся с этим случаем, и обработал его, вызвав команду taskkill для завершения запущенного процесса, включая дочерние элементы. Что-то вроде этого LaunchAppAndWait(TASKKILL,/F/PID + LAAW_PROCESS_INFORMATION.dwProcessId +/T, WAIT); - person yossiz74; 30.05.2018