Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1327515561
Псарь
2012-01-25 22:19
2012.06.03
Цикл AS3 -> Delphi цикл.


15-1328085629
Faceless
2012-02-01 12:40
2012.06.03
Настройки Delphi7


1-1294084277
TStas
2011-01-03 22:51
2012.06.03
Как получить размер экрана в дюймах или см?


15-1328089911
QAZ
2012-02-01 13:51
2012.06.03
Поиск замена в Delphi7


15-1328127890
Псарь
2012-02-02 00:24
2012.06.03
Constant 0 converted to NIL,





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский