список сообщений создать тему

Ошибка при обновлении программы

Версия:

Тип: Доработка
Статус: Завершено
Важность: Если время будет
При запуске выдаётся сообщение об обновлении, успешно скачиваются данные, выдаётся сообщение о готовности обновления. После подтверждения программа закрывается, через некоторое время выдаётся сообщение об ошибке "Упс. Что-то пошло не так".
Исполняемый файл и база находятся в сетевой папке, на папку пользователь имеет все права, кроме полного доступа.
На рабочем компьютере установлена Windows 7 Home Basic x64, на сервере - Windows Server 2003.
Если выдается упомянутое Вами сообщение, то программа не смогла выполнить одно из действий:
 
1. Переименовать файл в папке, в которой установлена программа.
2. Создать файл в папке, в которой установлена программа.
 
Причин может быть куча, я специальным анализом не занимался. Например, может просто не хватать места на носителе (на флешке, например). Или может быть недостаточно прав.
 
Я могу добавить немного диагностики в сообщение "Упс" чтобы стало понятнее, на чем получается затык.
 
Кстати, программа просит повысить права (UAC), когда предлагает установить обновление?

> 1. Переименовать файл в папке, в которой установлена программа.
 
Скорее всего, именно это и происходит, почему - мне пока тоже непонятно, права у пользователя есть. Разве что попробую сегодня дать полные права на сетевую папку.
 
> 2. Создать файл в папке, в которой установлена программа.
 
Временный файл вида {09448799-31ED-4CD2-8F01-BABA03A20254} создаётся успешно, дело не в этом.
 
> Причин может быть куча, я специальным анализом не занимался. Например, может просто не хватать места на носителе (на флешке, например). Или может быть недостаточно прав.
 
Места на сетевом диске достаточно. С правами попробую поэкспериментировать.
 
> Я могу добавить немного диагностики в сообщение "Упс" чтобы стало понятнее, на чем получается затык.
 
> Кстати, программа просит повысить права (UAC), когда предлагает установить обновление?
 
Нет, не предлагает. На этом компьютере UAC отключена (настройки установлены на "минимум").
Для диагностики проблемы с правами зашел на сервер локально под учётной записью "Администратор" (WinServer 2003). Запустил программу с сетевого диска. При попытке обновления сначала появилось сообщение о том, что файл "занят", после нажатия кнопки "Повтор"  - опять "Упс".
 
Ещё раз повторил операцию, но запустил программу с локального диска сервера: сообщение о "занятости" файла появилось, но после повтора обновление прошло успешно.
 
Очевидно, дело в правах. Но для решения ситуации расширенная диагностика будет не лишней.
Я добавил дополнительную диагностику по правам. Она должна проявиться уже при установке следующей 247-й сборки.
При обновлении на версию 247 выдано сообщение: Невозможно переименовать файл X:\AbilityCash\AbilityCash.exe, ошибка #32.
Ошибка номер 32, это код возврата функции GetLastError(). И означает он ERROR_SHARING_VIOLATION. То есть, это говорит о том, что файл занят. Где-то используется. Возможно, он открыт на другой рабочей станции.
Совершенно точно не открыт. Вероятно, проблема на стороне сервера, на моем компьютере программа уже закрыта, а файловая система сервера ещё не "освободила" файл.
Может быть, добавить в сообщение об ошибке кнопку "Повтор"? И не ограничивать количество повторов, пока пользователю не надоест Well.
И, возможно, кроме номера ошибки стоит выдавать и её расшифровку.
Вообще, это странно. Потому что перед тем, как пытаться переименовывать файлы, обновлялка дожидается завершения процесса AbilityCash.exe. Давать сообщение о повторе... Неудобное там место, честно говоря... Не буду обещать, подумаю.
 
А не хотите на локальной машине установить программу? Well
Обновлялка дожидается завершения процесса на локальной машине и не может, вообще говоря, знать, что об этом думает сервер, освободил ли он файл.
 
На локальной машине устанавливать не хочу, всё будет работать нормально, так не интересно. Well
 
К тому же, мне необходимо:
- обеспечить доступ с нескольких компьютеров в домашней локальной сети (чтобы жена могла самостоятельно пользоваться программой и не отбирала мой ноутбук - у неё свой есть и получше моего Well )
- на сервере настроены разнообразные средства удалённого доступа и я могу подключаться к нему извне, например, с работы.
 
При удалённом подключении я работаю на консоли сервера, при этом на сервере так же примонтирован сетевой диск с той же буквой (для единообразия в ini-файле). И ошибка выходит точно такая же, если запускаться с сетевого диска. А если запускать программу с локального диска, то обновление проходит успешно, как я уже писал выше.
 
Для меня уже очевидно, что загвоздка не в программе, а в моём сервере, который с разной скоростью обрабатывает обращения к диску напрямую и через "шару".
Тут есть еще один странный момент. Дело в том, что запущенный на исполнение файл exe можно переименовать. Попробуйте, запустите на исполнение любой exe-шник и пока программа работает можете спокойно переименовать его. Программа дожидается завершения процесса для того, чтобы удалить старую версию. А не для того, чтобы переименовать ее. А в вашем случае не выходит переименование exe-шника. По крайней мере, она ругается именно на это.
 
К слову, по ряду соображений замещение старой версии новой выполняется в три этапа:
 
1. Старый AbilityCash.exe переименовывается и получает некое временное название.
2. В папку программы копируется обновленный AbilityCash.exe
3. Предыдущая версия программы удаляется.
Действительно, странно и непонятно.
 
Я ещё раз проделал процесс, пошагово, наблюдая за открытыми файлами.
 
- после согласия на закрытие программы AbilityCash.exe пропадает на сервере из списка открытых файлов;
- выдаётся сообщение о невозможности переименовать файл, при этом AbilityCash.exe опять появляется в списке открытых файлов и висит там до закрытия сообщения об ошибке (так что кнопка "Повтор" не имеет смысла).
 
При этом Process Explorer выдаёт следующую информацию об AbilityCash.exe:
 

 

P.S. Мне кажется, что логичнее сообщение об обновлении выдавать сразу же после запуска программы, до открытия базы.
P.S. Мне кажется, что логичнее сообщение об обновлении выдавать сразу же после запуска программы, до открытия базы.

 
Сейчас проверка выполняется в отдельном потоке, который запускается сразу после открытия файла данных. Именно потому, что это отдельный поток, пользователь не замечает, что программа что-то там еще делает. Если я начну запускать поток до открытия файла, то, выходит, мне нужно будет дождаться окончания проверки до того, как открывать файл данных? Это может добавить к времени открытия данных до 1 секунды, что мне кажется слишком большой роскошью. Я не хочу ждать еще 1 секунду, пусть лучше оно проверяется в фоне и выдает результат уже на открытых данных.
У меня (при работе с программой по сети через беспроводное соединение) после перехода на новый формат базы и новую версию компилятора, суммарное время запуска программы и открытия базы увеличилось в 2-2,5 раза и доходит, в самых крайних случаях, до 10 секунд. Я привык. Мне лично лишняя секунда не помешает. А вот когда база уже открыта и я приготовился вводить данные - тут сообщение о наличии обновления выбивает из колеи.
Но настаивать не буду. Даже не буду предлагать сделать это опцией в программе. To wink
 
Пожалуй, я всё-таки последую вашему совету и решу проблему с обновлением установкой программы на локальные компьютеры, а базу по-прежнему буду держать на сервере. Теперь, при наличии автоматического обновления, поддержание актуальности программы на всех устройствах не составляет проблемы.
до 10 секунд
До 10 секунд, Карл!!!
 
Очень хочется узнать, сколько же в Вашем файле операций (курсов валют)?...
И сколько места на диске занимает такой файл?...
 
суммарное время <...> открытия базы увеличилось в 2-2,5 раза
А вот это полный непорядок. Буду разбираться, что же там такое тормозит. Кстати, когда я выпустил первую сборку 3-й версии, я спрашивал, увеличилось ли время открытия файла. Мне сказали, что не критично.
 
время запуска программы <...> увеличилось
Ну да, размер AbilityCash.exe тоже вырос. Но, согласитесь, прибавка в 1 мегабайт к размеру исполняемого файла не могла сильно увеличить время запуска программы, правда ведь?
Про 10 секунд я уточнял - "в самых крайних случаях". Это если я за двумя капитальными стенами от точки доступа, да ещё микроволновка рядом работает.  Well Обычно, всё-таки, меньше, секунд 5-6 (1-2 на запуск программы, с учётом того, что она тоже запускается с сервера, 3-4 на открытие базы): WiFi у меня не самый шустрый и сервер уже лет 6 пашет на материнке со встроенным Intel Atom, нагруженом торрентами.
 
14300 с небольшим операций с 01.01.2006. Курсы на 1 число месяца с 2009 года. Файл размером 5 "с копейками" мегабайт.
 
А вот это полный непорядок. Буду разбираться, что же там такое тормозит.

Ничего не тормозит, если работать на локальном диске ноутбука - всё летает.
 
я спрашивал, увеличилось ли время открытия файла. Мне сказали, что не критично.

Подтверждаю - не критично.
 
Но, согласитесь, прибавка в 1 мегабайт к размеру исполняемого файла не могла сильно увеличить время запуска программы, правда ведь?

Ну как сказать, у второй версии размер был меньше мегабайта, а сейчас - больше двух. Т.е., то, что раньше требовало меньше секунды на загрузку, теперь загружается около 1,5 секунд (в моём конкретном случае).
 
Ещё раз повторю: я прекрасно осознаю, что все озвученные мной времена загрузки программы и базы зависят исключительно от конфигурации моей локалки и никакого дискомфорта я от этого не ощущаю. Не стоит в этих вопросах на меня ориентироваться.
Мне вообще много и часто приходится сталкиваться с устаревшей техникой, я привык к тому, что ответ не всегда мгновенный. Well
И все же мне хотелось бы не терять много времени на том, что может работать гораздо быстрее.
 
Я сейчас посмотрел на своих данных. У меня файл открывается за 120 миллисекунд примерно (это только время загрузки данных в память и настройки индексов). Можно ли ускорить? Да, но это не в разы. Ну, может быть, получится уменьшить скорость процентов на 25-30.
 
Теоретически, для Вашего случая можно было бы кардинально увеличить скорость загрузки, если разнести на параллельные потока: в одном выполнять чтение данных с диска, а во втором - размещение структур данных в памяти и создание индексов. В Вашем случае огромное количество времени уходит на медленную сеть и передачу данных в программу. И сейчас программа просто простаивает, ждет данные, потом получает данные, начинает их выстраивать в памяти, создает индексы, и только после этого запускает запрос новых данных.
 
Однако, такая переделка очень серьезная и вряд ли я ее потяну в ближайшее время. Хотя да, задача очень интересная.
Я замерил скорость загрузки в "идеальных" условиях: программа запускается с локального диска (практически моментально, доли секунды), ноутбук рядом с роутером - база загрузилась с сервера примерно за 2 секунды.
Так что всё нормально, в ближайшем будущем принципиально оптимизировать скорость загрузки, на мой взгляд, нет необходимости.
А если когда-нибудь, о чём как-то шёл разговор, база переедет в онлайн, это вообще перестанет иметь решающее значение, всё будет упираться в скорость интернет-канала.