Форум: "Прочее";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];
ВнизКак правильно обновляться программу Найти похожие ветки
← →
>|< (2012-01-26 14:26) [0]Суть такова:
есть внешнее приложение, которое обновляет основную программу.
Сначала стартует основное приложение, идет в базу и смотрит, есть ли обновления для скачивания.
Если есть, запускается внешний обновлятор, а сама программа завершает работу.
Вот в этом месте нужно дождаться, когда основное приложение выгрузило себя из памяти, иначе программа обновления не может обновить и натыкается на файлы, которые заняты основным приложением.
Как проверить в программе обновления, что основное приложение выгружено и можно начинать обновление?
← →
Сергей М. © (2012-01-26 14:33) [1]кури мьютекс, он для этой цели подойдет довольно кстати.
← →
Anatoly Podgoretsky © (2012-01-26 14:37) [2]> >|< (26.01.2012 14:26:00) [0]
бат файл
← →
Dimka Maslov © (2012-01-26 14:39) [3]Запудзырь внешний обновлятор в автозагрузку, пусть сам и проверяет и обновляет. Так гораздо проще. Все так делают.
← →
>|< (2012-01-26 14:46) [4]
> Сергей М. © (26.01.12 14:33) [1]
у меня тоже была такая идея.
Основное приложение использует мьютекс для предотвращения запуска второго экземпляра.
как правильно дождаться освобождения этого мьютекса:
initialization
repeat
hMutex_MAINAPP := CreateMutex(nil, false, MUTEX_NAME_MAINAPP);
k := GetLastError();
ReleaseMutex(hMutex_MAINAPP);
until (k <> ERROR_ALREADY_EXISTS) and (k <> ERROR_ACCESS_DENIED);
имя hMutex_MAINAPP определено в основном приложении как
{F57CA977-3D3B-448A-9AA6-4A83D490CCBC}
и оно также определено в программе обновления.
Правильно ли использовать цикл repeat... until в секции initialization в приложении обновления для ожидания выгрузки основного приложения из памяти?
← →
>|< (2012-01-26 14:47) [5]Dimka Maslov © (26.01.12 14:39) [3]
спасибо. оценил Ваш юмор))
← →
>|< (2012-01-26 15:34) [6]
> initialization
> repeat
> hMutex_MAINAPP := CreateMutex(nil, false, MUTEX_NAME_MAINAPP);
>
> k := GetLastError();
> ReleaseMutex(hMutex_MAINAPP);
> until (k <> ERROR_ALREADY_EXISTS) and (k <> ERROR_ACCESS_DENIED);
>
такой вариант не подходит
возможно стоит по другому проверять этот мьютекс?
← →
Сергей М. © (2012-01-26 15:46) [7]
> как правильно дождаться освобождения этого мьютекса
Любой Wait-функцией из арсенала имеющихся в WinAPI.
Штатно отпущенный мьютекс просигналит WAIT_OBJECT_0[+N], брошенный - WAIT_ABANDONED
← →
Dimka Maslov © (2012-01-26 19:21) [8]
> спасибо. оценил Ваш юмор))
Это не шутка. Гораздо проще обновить файл, когда он заведомо не используется, не создавая при этом себе дополнительных трудностей.
← →
Андреевич (2012-01-26 20:24) [9]я в темп извлекаю из ресурсов маленький обновлятор и запускаю, а саму прогу закрываю. "обновлятор" переодически некоторое время пробует переписать файл программы
← →
>|< (2012-01-27 10:32) [10]
> Это не шутка. Гораздо проще обновить файл, когда он заведомо
> не используется, не создавая при этом себе дополнительных
> трудностей.
дело в том, что обновления могут появиться во время работы программы.
Пользователь получает уведомление и обновляется.
Если обновляются не системные модули, то перегрузка не нужна.
Если сама программа и базовые модули - то нужно перегрузиться, чтобы выгрузить из памяти старые версии файлов.
Обновлятор скачивает их в темповую папку и потом пытается перезаписать.
Если с первой попытки не удалось, он снова сравнивает версии файлов локальных и тех, что в базе. Если версия в базе выше, то обновлятор снова обновляет и так пока все версии файлов не будут синхронизированы.
Если залочить какой-нить файл, который нужно обновить, то обновлятор будет работать циклически, пока не освободится необходимый файл.
← →
Anatoly Podgoretsky © (2012-01-27 10:49) [11]> >|< (27.01.2012 10:32:10) [10]
> Обновлятор скачивает их в темповую папку и потом пытается перезаписать.
Изначально провальный подход, чреват также и разрушением программы, тогда и
обновлять нечем будет
← →
>|< (2012-01-27 11:12) [12]
> чреват также и разрушением программы
программа работает пол года у 1500 человек и ни у кого еще не было ее разрушения.
Бывают случаи, когда антивирус лочит файл на время проверки и его невозможно обновить. Тогда обновлятор запускается по новому кругу и снова пытается обновить
← →
Компромисс © (2012-01-27 11:39) [13]>|< (27.01.12 10:32) [10]
Всё равно может быть проще внешним "обновлятором". Если при работе программы пришло уведомление об обновлении, требующей перегрузки, программа закрывается, последней командой вызывает тот самый внешний updater, который и делает все необходимые операции. Заодно и пользователю будет предоставлен шанс сохранить все свои изменения, потому как имеем штатное закрытие программы.
← →
>|< (2012-01-27 11:47) [14]
>
> Всё равно может быть проще внешним "обновлятором". Если
> при работе программы пришло уведомление об обновлении, требующей
> перегрузки, программа закрывается, последней командой вызывает
> тот самый внешний updater, который и делает все необходимые
> операции. Заодно и пользователю будет предоставлен шанс
> сохранить все свои изменения, потому как имеем штатное закрытие
> программы.
Так и есть. Присутствует главное приложение и внешний обновлятор Updater.exe
И пользователю предлагается сохранить изменения.
Вернее, каждые 10 минут появляется окно с напоминанием обновиться
← →
Anatoly Podgoretsky © (2012-01-27 11:49) [15]> >|< (27.01.2012 11:12:12) [12]
У нас встречались люди, которое подобное говорили, но про интервал лет 5 или
более, а теперь пошли AV
Ты играешь в рулетку
← →
Inovet © (2012-01-27 12:08) [16]> [15] Anatoly Podgoretsky © (27.01.12 11:49)
> У нас встречались люди, которое подобное говорили, но про
> интервал лет 5 или более, а теперь пошли AV
Вызывать обычный инсталятор в режиме обновления, может быть в тихом каком?
← →
Dimka Maslov © (2012-01-27 12:34) [17]
> дело в том, что обновления могут появиться во время работы
> программы.
Неужели обновления настолько критичны, что нельзя подождать до утра, пока компьютер перезагрузится?
> Если сама программа и базовые модули - то нужно перегрузиться,
> чтобы выгрузить из памяти старые версии файлов.
При обновлении внешней программой на этапе автозагрузки ни сама программа, ни базовые модули ещё в память не загружены - дополнительная перезагрузка не понадобится.
> Бывают случаи, когда антивирус лочит файл на время проверки
> и его невозможно обновить
Нормальный антивирус проверяет файл по факту обращения к нему не возвращая управление в программу до конца проверки.
← →
Андреевич (2012-01-27 13:47) [18]
> Изначально провальный подход, чреват также и разрушением
> программы, тогда и
> обновлять нечем будет
чем это провальный подход?
скачай новую версию программы, проверь crc, положи в тем. Извлеки туда обновлятор, запустит его и закройся. Обновлятор сделает бекап старого, заменит новое, если новое по ряду причин не запишется - вернет старое. А то и вообще без этих махинаций с бекапом, метод достаточен для подавляющего большинства программ.
> Неужели обновления настолько критичны, что нельзя подождать
> до утра, пока компьютер перезагрузится?
компьютер может не перегружаться до следующего обновления (в смысле вин_апдейта). Но и прерывать работу программы и мешать такими диалогами - тоже надо отдельно рассматривать такой подход.
← →
Anatoly Podgoretsky © (2012-01-27 14:05) [19]> Андреевич (27.01.2012 13:47:18) [18]
Так ты то другое предлагаешь. С бекапами и процедурой над копией, а у него
по живому. Прокол один - запусти из TEMP программу, антивирус может не
позволить
← →
Dimka Maslov © (2012-01-27 14:14) [20]
> компьютер может не перегружаться до следующего обновлени
Scheduler запусти на три часа ночи. Все проблемы решены.
← →
Андреевич (2012-01-27 17:23) [21]
> Так ты то другое предлагаешь. С бекапами и процедурой над
> копией, а у него
> по живому. Прокол один - запусти из TEMP программу, антивирус
> может не
> позволить
переместить себя запущенного и на свое бывшее место поместить новый экземпляр на старое место. Но это, имхо, упущение у МС.
запускал много раз программу из temp, корпоративные и домашние антивирусы от МС и ухом не ведут, КИС так же, и Нортон. И вообще без разницы откуда запущена программа, антивирус должно волновать кто запустил и проверена ли она. А путь не является фактором подозрительности.
> Scheduler запусти на три часа ночи. Все проблемы решены.
ладно, напишем точнее: нет необходимости перезапускать компьютер. Соответственно нужно исходить из этого и не делать подобных костыльных методов обновления. Компьютер и работа за ним далеко не для всех одначает работу в одной программе ради которой необходимо перезапускать рабочую станцию.
← →
Anatoly Podgoretsky © (2012-01-27 17:35) [22]> Андреевич (27.01.2012 17:23:21) [21]
Ну например McAfee есть настройка, по умолчанию, запрещающая запускать из
TEMP, надеюсь понятно почему
← →
Anatoly Podgoretsky © (2012-01-27 17:45) [23]> Anatoly Podgoretsky (27.01.2012 17:35:22) [22]
И даже не настройка а политика в корпоративном варианте
← →
Inovet © (2012-01-27 17:47) [24]> [21] Андреевич (27.01.12 17:23)
> переместить себя запущенного и на свое бывшее место поместить
> новый экземпляр на старое место.
Это екзешник. А всё остальное как?
← →
Андреевич (2012-01-27 20:54) [25]
> Ну например McAfee есть настройка, по умолчанию, запрещающая
> запускать из
> TEMP, надеюсь понятно почему
из-за глупости писателей макафи. Отказались от него года 3 назад, любил файлы dbf лочить от записи, досаждало дико. Любил подвисать на новелах, как встрянет на каком нибудь текстовом файле и все висит, пока через rc сервак не ребутнешь.
> Это екзешник. А всё остальное как?
я так понял что затык как раз "обновить самого себя". Впрочем лично моего софта мало обновляемого, и делает это отдельная прога, докачивает только изменения и поддерживает 3 протокола, которые тянуть в основную программу не имеет смысла.
← →
Anatoly Podgoretsky © (2012-01-27 21:01) [26]> Андреевич (27.01.2012 20:54:25) [25]
Про новел не знаю, очень давно их не вижу, а с dbf, видимо с mdx в голову не
приходило включить их в исключения, все семейство.
← →
antonn © (2012-01-27 21:41) [27]Самое странное что такое поведение было далеко не на всех новелах, хотя там все было одинаково на всех. Были очень живучие гады, храню скриншот веб-интерфейса новела где аптайм чуть больше 4х лет :) (с электричеством и температурой проблем небыло, об этом позаботились МТСовцы разместив свое барахло рядом с нашим, очень выгодное соседство =)).
А на новеле как раз вроде был игнор для dbf/ntx, на рабочих машинах не делалось. Там кроме блокирования файлов проблем хватало, на некоторых машинах блокировалась исходящая почта, пока службу макафи не выгрузишь - не отправлялась (аутлук экспресс и мс аутлук были). Не раз мне dameware удалял, как потенциально опасное ПО удаленного управления :) Ну и вообще макафи по части аппетитов к ресурсам был неравнодушен.
← →
>|< (2012-01-30 13:30) [28]2 Сергей М. © (26.01.12 15:46) [7]
>
>
> > как правильно дождаться освобождения этого мьютекса
>
>
> Любой Wait-функцией из арсенала имеющихся в WinAPI.
> Штатно отпущенный мьютекс просигналит WAIT_OBJECT_0[+N],
> брошенный - WAIT_ABANDONED
WaitForSingleObject подойдет?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.004 c