[ОТВЕТИТЬ]
05.02.2016 15:46
OlegON
 
Собственно, нужно, чтобы когда комп ребутился, пропадал файлик, которым я отмечаю запущенность моей программки. Как этого можно добиться?
Поясню.
1. Запускается программка, создает файлик.
2. Запускается программка опять, видит файлик и выходит.
3. Программка завершается и удаляет файлик.

Вот, если между 1. и 3. рубануть по питанию, то файлик застревает и программка застревает надолго (возраст файлика проверяется). Есть ли возможность в винде создать файл как-то так, чтобы при перезагрузке он пропадал?
05.02.2016 15:49
twix
 
А почему бы не использовать мьютексы?

А вообще, если надо совсем деревянно, то просто добвляй команду на удаление файлика в ветку реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Currentversion\RunOnce" при каждом успешном запуске программы, и всё.
05.02.2016 16:12
KirillHome
 
А что, в планировщик прописать задачу на удаление файл "при запуске компьютера" - не получается?
05.02.2016 16:14
baggio
 
Цитата:
OlegON Собственно, нужно, чтобы когда комп ребутился, пропадал файлик, которым я отмечаю запущенность моей программки. Как этого можно добиться?
Поясню.
1. Запускается программка, создает файлик.
2. Запускается программка опять, видит файлик и выходит.
3. Программка завершается и удаляет файлик.

Вот, если между 1. и 3. рубануть по питанию, то файлик застревает и программка застревает надолго (возраст файлика проверяется). Есть ли возможность в винде создать файл как-то так, чтобы при перезагрузке он пропадал?
а проверить наличие в памяти никак?
05.02.2016 16:28
student
 
для винды
когда то давным давно (даже и не помню от куда :() .... но сохранилось без купюр :)

Чтобы не чистить вручную временные папки: C:\Users\Administrator\AppData\Local\Temp или C:\Users\YourNickname\AppData\Local\Temp и C:\Windows\Temp можно автоматизировать данный процесс при выходе из системы
1) Создайте командный файл сценария:
Инструкция:
1. Скопируйте код в любой текстовый редактор (например, Блокнот).
2. Нажмите CTRL+S и сохраните файл с любым именем и расширением. cmd
3. Если вы выбираете тип файла: Текстовые файлы, то имя файла в кавычки брать обязательно. (Например: “tempdirclean. cmd”)
4. Если вы выбираете тип файла: Все файлы, то имя файла в кавычки брать не надо.
PUSHD %TEMP% 2>Nul RD /S/Q “%TEMP%” POPD PUSHD %WinDir%\TEMP 2>Nul RD /S/Q “%WinDir%\TEMP” POPD
2) Скопируйте его для удобства в корневую папку диска С:
3) Запустите редактор групповых политик: Пуск -> Выполнить -> gpedit. msc или Win+R -> gpedit. msc
4) Откройте ветвь Конфигурация пользователя > Конфигурация Windows > Сценарии (вход/выход из системы).
5) В правой части два раза кликните по параметру Выход из системы или нажмите правую кнопку мыши и выберите пункт Свойства.
6) Нажмите кнопку Добавить, укажите месторасположение созданного Вами командного файла c:\tempdirclean. cmd
7) Нажмите Ок, затем снова Ок
Теперь при выходе из системы, а также при завершении работы временные папки очистятся автоматически.
Внимание: Если по указанной выше схеме Вы добавите командный файл сценария в свойства параметра Выход из системы, находящийся в ветке Конфигурация компьютера > Конфигурация Windows > Сценарии (запуск/завершение), то пользовательская временная папка очищена не будет, а очистится только временная папка самой Windows.
==========================
т.е. если создать свой сценарий то возможно не только удалять любой файлик но и делать еще кучу всего полезного
05.02.2016 16:47
whitewizard
 
Некошерно. Лучше сверять время файлика и брать время запуска винды.
05.02.2016 16:51
OlegON
 
Спасибо большое за отклики, но ...
1. Это Java, т.е. мьютексами я только в пределах одной виртуальной машины могу что-то сделать. Т.е. применение ограничено только потоками максимум.
2. По той же причине никак не могу добраться до памяти.
3. Планировщик идет лесом, поскольку он тупо может не работать, либо опять косяки во многообразии винды.
4. Всякие сценарии по очистке системы собирать - обязательно где-то не сработает приблизительно с такими же рисками, как и то, что файл останется по ребуту. Сделать надо из софта, руками никто ничего делать не будет.
5. Забегая вперед, всякие папки автозагрузки тоже не катят, возможно, что никто не залогинится.
05.02.2016 16:52
OlegON
 
Цитата:
whitewizard Некошерно. Лучше сверять время файлика и брать время запуска винды.
Опять налетаем на Java. Запускать какую-то утилиту и читать ее вывод со всеми локализациями - круто слишком...

Бесит эта недоос...
05.02.2016 17:10
whitewizard
 
тогда обновляй каждую минуту файл флага, при условии, что не более двух минут прошло со времени последнего обновления.
иначе удаляй его.
05.02.2016 17:14
baggio
 
Цитата:
OlegON Спасибо большое за отклики, но ...
1. Это Java, т.е. мьютексами я только в пределах одной виртуальной машины могу что-то сделать. Т.е. применение ограничено только потоками максимум.
2. По той же причине никак не могу добраться до памяти.
3. Планировщик идет лесом, поскольку он тупо может не работать, либо опять косяки во многообразии винды.
4. Всякие сценарии по очистке системы собирать - обязательно где-то не сработает приблизительно с такими же рисками, как и то, что файл останется по ребуту. Сделать надо из софта, руками никто ничего делать не будет.
5. Забегая вперед, всякие папки автозагрузки тоже не катят, возможно, что никто не залогинится.
тупо писать какойто watchdog... как бы стандарт...
05.02.2016 17:14
student
 
Цитата:
OlegON 4. Всякие сценарии по очистке системы собирать - обязательно где-то не сработает
все таки это же групповые политики и там события и на вход и на выход одновременно - сомневаюсь что оба они будут не отработаны
05.02.2016 17:15
baggio
 
погоди... а что мешает писать в файл... если файл занят на запись значит прога работает... свободен.... значит на запущена...
05.02.2016 17:15
OlegON
 
Цитата:
whitewizard тогда обновляй каждую минуту файл флага, при условии, что не более двух минут прошло со времени последнего обновления.
иначе удаляй его.
Да, я уже думал над этим. Чем не нравится - придется делать параллельный поток (в основном есть долгие процедуры), если повиснет сам мой софт, этот поток будет обновлять файл до посинения, а сейчас через несколько часов файл убивается новой запущенной программой, считая предыдущий экземпляр зависшим.
05.02.2016 17:17
OlegON
 
Цитата:
student все таки это же групповые политики и там события и на вход и на выход одновременно - сомневаюсь что оба они будут не отработаны
не отработает создание этих политик на автомате :)
05.02.2016 17:18
baggio
 
а еще можно кидаться бродкастами ... каждую секунду...
при старте пауза... ждем нет ли нужных бродкастов... если нет - прога не работает...
если есть пакетики - работает...
не? помоему иде яне плохая?
05.02.2016 17:18
OlegON
 
Цитата:
baggio погоди... а что мешает писать в файл... если файл занят на запись значит прога работает... свободен.... значит на запущена...
Аналогично варианту с обновлением файла, даже хуже, поскольку, если прога повиснет, то флаги начисто отменяем... Еще ребутиться придется на недоос, чтобы его снести...
05.02.2016 17:21
OlegON
 
Цитата:
baggio а еще можно кидаться бродкастами ... каждую секунду...
при старте пауза... ждем нет ли нужных бродкастов... если нет - прога не работает...
если есть пакетики - работает...
не? помоему иде яне плохая?
Идея плохая тем, что по сути равная постоянному обновлению файлика, она слишком усложняет конструкцию и ресурсы жрать будет.

Вы сильно углубляетесь в алгоритмические изыски, в то время, как вопрос-то был немного другой... Под виндой убогой это сделать можно или нет?
05.02.2016 17:21
student
 
создай UDP-сокет на localhost - при каждом запуске проверяй занят ли уже нужный UDP-порт - занят - пошли на него пакет чтобы уже работающее поставило фокус на себя и выйди - все в памяти и никаких файлов :)

пы сы
походу опередили :)
08.03.2016 03:36
Tema
 
странная схема в первом сообщении, не проще было стандарт использовать?
- создаем файл-флаг
- делаем дело
- удаляем файл

если файл есть, значит дело не сделано - предпринимаем меры. Время предыдущего запуска, если нужно, сохраняем отдельно.
08.03.2016 06:32
OlegON
 
Цитата:
OlegON 1. Запускается программка, создает файлик.
3. Программка завершается и удаляет файлик.
Вот, если между 1. и 3. рубануть по питанию, то файлик застревает и программка застревает надолго (возраст файлика проверяется).
Цитата:
Tema странная схема в первом сообщении, не проще было стандарт использовать?
- создаем файл-флаг
- удаляем файл
либо я тебя неправильно понял, либо ты первое сообщение не читал... В чем твоя схема отличается от моей и как она защищена от ребута и прочих убийств программы между 1 и 3? Напоминаю, что суть кроссплатформенная, поэтому WM_* поймать не удастся.
08.03.2016 15:06
Tema
 
Цитата:
OlegON либо я тебя неправильно понял, либо ты первое сообщение не читал... В чем твоя схема отличается от моей и как она защищена от ребута и прочих убийств программы между 1 и 3? Напоминаю, что суть кроссплатформенная, поэтому WM_* поймать не удастся.
возможно я не понял. Из твоего описания в п.1 выглядит так как-будто программа запускается, создает файл и что дальше происходит неясно - висит ли она в простое, или завершается? Но используя магические способности, предположим (), что вероятно программа периодически запускается по таймеру и работает некое время, и может быть не успевает завершиться до следующего запуска.

в принципе да, всё похоже, просто из условий не совсем непонятно что ты хочешь от схемы

если расширить всю схему на несколько запусков:
первый запуск:
1) запускается программа:
а) проверяется наличие флага, если нет - создается флаг, если есть - значит предыдущий запуск был не закончен и возможно нужно сделать что-то еще по устранению последствий, либо работает другой экземпляр программы - проблема в том чтобы различить эти моменты?
б) делается дело,
в) удаляется флаг и завершается программа,

второй запуск:
2) см.п.1

Так?
08.03.2016 17:57
OlegON
 
Проблема, да, была как раз в том, чтобы не дать запуститься второй копии и только тогда, когда работает предыдущая.
Файловый флаг под Windows страдает своим наличием при ребуте, т.е. программы нет, а флаг есть.
Я сейчас обошел через установку флага в базе, поскольку программа работает с ней, при дисконнекте или ребуте, флаг пропадает.
Но в целом видно, что Win в очередной раз в пролете, поскольку в Linux есть очищающаяся при перезагрузке директория для этих вот целей.
08.03.2016 18:45
Tema
 
в java можно попробовать через JMX, а конкретнее, через MBeanServer, там можно динамически создать параметр и проверять-менять его в другом экземпляре программы. Соответственно при ребуте его не должно быть видно.
08.03.2016 18:56
OlegON
 
Спасибо за идею, однако было интересно в свете именно винды и ее возможностей, которые, как мы видим, отсутствуют в очередной раз...
09.03.2016 10:26
grannie
 
FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE



Не?
09.03.2016 10:28
OlegON
 
Вот, к сожалению, это все либо подразумевает корректное закрытие приложения, либо не видно из другого приложения...
09.03.2016 10:47
Micle
 
Цитата:
OlegON Но в целом видно, что Win в очередной раз в пролете, поскольку в Linux есть очищающаяся при перезагрузке директория для этих вот целей.
Не понимаю, что мешает организовать такую же в винде...
09.03.2016 10:57
grannie
 
А почему мы зациклились на одном флаге? Кто мешает создать, например, два, по началу и концу процесса? Для эстетов можно юзать потоки в одном файле.
09.03.2016 11:13
Micle
 
Цитата:
grannie А почему мы зациклились на одном флаге? Кто мешает создать, например, два, по началу и концу процесса? Для эстетов можно юзать потоки в одном файле.
Как я понимаю проблема в зависании. Т.е. когда программа висит, она по флагам будет выглядеть как запущенная.

При принудительной перезагрузке компа, флаги останутся. Вот тут их и нужно безусловно удалять при запуске системы. Этого можно добиться например положив bat файл в автозагрузку, который и будет заниматься удалением файлов

Код:
%appdata%\microsoft\windows\start menu\programs\startup\


ЗЫ: Зависания кроссплатформенной Жабы - это нормально, то что винда каталоги не чистит автоматом - это прям проблема проблем....
09.03.2016 14:42
grannie
 
Цитата:
Micle Как я понимаю проблема в зависании. Т.е. когда программа висит, она по флагам будет выглядеть как запущенная.

При принудительной перезагрузке компа, флаги останутся.
Если мы "флагируем" И начало, И конец процесса - мы всегда сможем разобраться после внезапной уборщицы, вытаскивающей кабель из сервера, запущен ли уже процесс штатно или "висит".
Так кто/что нам это мешает делать?


Опции темы


Часовой пояс GMT +3, время: 22:55.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.