Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.06.03;
Скачать: CL | DM;

Вниз

Как правильно обновляться программу   Найти похожие ветки 

 
>|<   (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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.009 c
2-1327746260
Festil
2012-01-28 14:24
2012.06.03
Динамические TButton, определение нажатия.


15-1328346033
Smile
2012-02-04 13:00
2012.06.03
Субботняя задачка :)


15-1328455559
uzer
2012-02-05 19:25
2012.06.03
Вопрос по N-кодеру/валкодеру и программы к нему


2-1327475787
Xmen
2012-01-25 11:16
2012.06.03
ExcelApplication1WorkbookBeforeClose не получается закрыт Excel


15-1328469314
Artem
2012-02-05 23:15
2012.06.03
Как определить что в COM-порт пришли данные?