Конференция "Основная" » Как узнать, сколько копий приложения запущенно?
 
  • тКнопка (10.04.08 23:53) [0]
    Как узнать, сколько копий приложения работает в данный момент времени?
  • Семеныч (11.04.08 00:00) [1]
    1. Создать Memory Mapped File в страничной памяти системы (см. CreateFileMapping и MapViewOfFile) размером 4 байта.

    2. Эти 4 байта содержат счетчик запущенных копий. Каждая новая запущенная копия инкрементирует его.
  • тКнопка (11.04.08 00:18) [2]
    Уточнение:
    мне даже не важно знать сколько именно копий работает,
    а достаточно лишь знать работают ли еще другие копии программы в данный момент или нет?
  • Германн © (11.04.08 00:26) [3]

    > тКнопка   (11.04.08 00:18) [2]

    Совет [1] вполне подходит.
  • Семеныч (11.04.08 01:02) [4]
  • Германн © (11.04.08 01:25) [5]

    > Семеныч   (11.04.08 01:02) [4]

    То обсуждение не было "завершено". Бо сам вопрос попытки повторного запуска приложения гораздо более сложный. В архивах можно найти более плодотворное обсуждение данного вопроса, но нет времени/желания копаться в архивах.
  • Семеныч (11.04.08 01:31) [6]
    > Германн ©   (11.04.08 01:25) [5]

    > нет времени/желания копаться в архивах.

    И смысла тоже - для профи вопрос совершенно ясен и без архивов.
  • DrPass © (11.04.08 01:33) [7]

    > 1. Создать Memory Mapped File в страничной памяти системы
    > (см. CreateFileMapping и MapViewOfFile) размером 4 байта.
    >
    >
    > 2. Эти 4 байта содержат счетчик запущенных копий. Каждая
    > новая запущенная копия инкрементирует его.

    Это плохой способ. Каждая умершая не своей смертью копия оставит свой след в этом счетчике. Что мешает просто пройтись по процессам любым доступным способом и посмотреть, из какого модуля они запускались?
  • Германн © (11.04.08 01:39) [8]

    > DrPass ©   (11.04.08 01:33) [7]
    >
    >
    > > 1. Создать Memory Mapped File в страничной памяти системы
    > > (см. CreateFileMapping и MapViewOfFile) размером 4 байта.
    >
    > >
    > >
    > > 2. Эти 4 байта содержат счетчик запущенных копий. Каждая
    > > новая запущенная копия инкрементирует его.
    >
    > Это плохой способ. Каждая умершая не своей смертью копия
    > оставит свой след в этом счетчике.

    Это нормальный способ для нормальных случаев. Параноики могут использовать любые другие способы по их выбору. :)
    Не прими на свой счёт.
  • Семеныч (11.04.08 01:41) [9]
    > DrPass ©   (11.04.08 01:33) [7]

    Верно. Но этот способ более трудоемок и какой выбрать (более простой или более точный) - это зависит от требований задачи. В данном случае, как выяснилось, даже и счетчика не нужно.
  • Германн © (11.04.08 01:53) [10]

    > Семеныч   (11.04.08 01:41) [9]
    >
    > > DrPass ©   (11.04.08 01:33) [7]
    >
    > Верно. Но этот способ более трудоемок и какой выбрать (более
    > простой или более точный) - это зависит от требований задачи.
    >  В данном случае, как выяснилось, даже и счетчика не нужно.
    >
    >

    В этом случае ещё ничего не известно. Судя по [0] и [2]. По моему опыту знаю, что возможен допвопрос: "Если уже запущена моя программа, то как ей передать командную строку".
  • тКнопка (11.04.08 02:08) [11]

    > DrPass ©   (11.04.08 01:33) [7]
    ... Что мешает просто пройтись
    > по процессам любым доступным способом и посмотреть, из какого
    > модуля они запускались?


    А может-ли кто-нибудь показать простейший пример?
  • Германн © (11.04.08 02:17) [12]

    > тКнопка   (11.04.08 02:08) [11]
    >
    >
    > > DrPass ©   (11.04.08 01:33) [7]
    > ... Что мешает просто пройтись
    > > по процессам любым доступным способом и посмотреть, из
    > какого
    > > модуля они запускались?
    >
    >
    > А может-ли кто-нибудь показать простейший пример?
    >

    Тебя испугало "Memory Mapped File"? Тогда простейший пример тебя испугает ещё больше. Лучше сразу напиши "дайте код!".
  • тКнопка (11.04.08 02:30) [13]

    > Германн ©   (11.04.08 02:17) [12]
    ...
    > Тебя испугало "Memory Mapped File"? Тогда простейший пример
    > тебя испугает ещё больше. Лучше сразу напиши "дайте код!
    > ".


    Нет, такой способ ( "Memory Mapped File" ) мне не подходит.
    Мне нужно пройтись по процессам, как подсказывает DrPass .
    Дайте код!
  • Riply © (11.04.08 02:40) [14]
    > [13] тКнопка   (11.04.08 02:30)
    > Нет, такой способ ( "Memory Mapped File" ) мне не подходит.
    > Мне нужно пройтись по процессам, как подсказывает DrPass .
    > Дайте код!

    "пройтись по процессам" не совсем то, что надо.
    Зависит от причин по которым нельзя допустить второй запуск.
    Пользователь может запустить программу под разными именами (переименовывая exe-файл)
  • Германн © (11.04.08 02:53) [15]

    > Riply ©   (11.04.08 02:40) [14]

    Саш. Дай ему код. Но в "черновике". Пусть поймёт всю сложность задачи.
  • Германн © (11.04.08 02:55) [16]

    > Германн ©   (11.04.08 02:53) [15]
    >
    >
    > > Riply ©   (11.04.08 02:40) [14]
    >
    > Саш. Дай ему код. Но в "черновике". Пусть поймёт всю сложность
    > задачи.
    >

    Не. Не так сформулировал.
    Дай ему код в "наброске".
  • тКнопка (11.04.08 02:59) [17]
    Уточню. Задача такая: при закрытии программы, нужно проверить, если больше нет запущенных копий программы, то нужно удалить временную попку и все ее соджержание.
  • Германн © (11.04.08 03:08) [18]

    > тКнопка   (11.04.08 02:59) [17]
    >
    > Уточню. Задача такая: при закрытии программы, нужно проверить,
    >  если больше нет запущенных копий программы, то нужно удалить
    > временную попку и все ее соджержание.
    >

    Эээ. Если не обращать внимание на "некую скабрезность вопроса", то чем не устраивают ответ [1]?
  • Andy BitOff © (11.04.08 03:16) [19]
    > тКнопка   (11.04.08 02:59) [17]

    Сделай проще. Создай в этой "попке" файл а в нем счетчик и будет у тебя программа завершаться через проверку попки =)))
  • тКнопка (11.04.08 03:38) [20]
    Упс, ошибка, "временная папка".

    А если электричество выключат, ведь счетчики останутся? И там еще предусмотренно аварийное востановление. и т.д. ...

    Вобщем, я решил остановиться на EnumWindows! Так можно? Дайте код! :)
  • Германн © (11.04.08 04:07) [21]

    > тКнопка   (11.04.08 03:38) [20]
    >
    > Упс, ошибка, "временная папка".
    >
    > А если электричество выключат

    А если электричество выключат, Это уже не твоя забота, если твоя задача не разработка "системы жизнеобеспечения"!
  • KSergey © (11.04.08 07:44) [22]
    Для енумерации процессов у пользователя из под которого запущена прога может банально не хватить прав. А работать под админом - зло.
  • тКнопка (11.04.08 08:15) [23]
    EnumWindows подойдет?
  • clickmaker © (11.04.08 11:41) [24]
    EnumProcesses или Process32First/Next
  • Семеныч (11.04.08 14:26) [25]
    Кошмар.

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

    И никаких копий вообще определять не нужно.
  • тКнопка (11.04.08 19:41) [26]

    > clickmaker ©   (11.04.08 11:41) [24]
    > EnumProcesses или Process32First/Next


    [Pascal Error] Unit3.pas(29): E2003 Undeclared identifier: 'Process32First'

    [Pascal Error] Unit3.pas(30): E2003 Undeclared identifier: 'EnumProcesses'
  • {RASkov} © (11.04.08 19:44) [27]
    > [26] тКнопка   (11.04.08 19:41)

    Ctrl+F ищи и подключай необходимые модули... так же просто F1 может помочь...
  • тКнопка (11.04.08 19:57) [28]

    > KSergey ©   (11.04.08 07:44) [22]
    > Для енумерации процессов у пользователя из под которого
    > запущена прога может банально не хватить прав. А работать
    > под админом - зло.


    Это что значит, EnumProcesses или Process32First/Next не подойдет?
  • Efir (11.04.08 20:34) [29]
    Можно еще использовать мьютексы.
  • Loginov Dmitry © (11.04.08 23:04) [30]
    > Уточню. Задача такая: при закрытии программы, нужно проверить,
    > если больше нет запущенных копий программы, то нужно удалить
    > временную попку и все ее соджержание.


    Удаляй временную папку при старте первого экземпляра. Это гораздо проще.
  • Германн © (12.04.08 01:05) [31]

    > Loginov Dmitry ©   (11.04.08 23:04) [30]


    > Удаляй временную папку при старте первого экземпляра. Это
    > гораздо проще.
    >

    И не проще (судя по сабжу) и неверно по сути.
  • clickmaker © (12.04.08 19:06) [32]
    > [25] Семеныч   (11.04.08 14:26)

    а если не нужна проге папка?
  • Семеныч (12.04.08 22:19) [33]
    > clickmaker ©   (12.04.08 19:06) [32]

    Тогда плохо. Тогда придется прочесть ветку. Ну пусть не всю, но хотя бы [0] и [17]
  • Leonid Troyanovsky © (13.04.08 10:33) [34]

    > Семеныч   (12.04.08 22:19) [33]

    > Тогда плохо. Тогда придется прочесть ветку. Ну пусть не
    > всю, но хотя бы [0] и [17]

    Дык, все равно, непонятно, зачем каждый раз создавать-удалять папку.

    А файлы можно создать with FILE_ATTRIBUTE_TEMPORARY & FILE_FLAG_DELETE_ON_CLOSE - FAF.

    --
    Regards, LVT.
 
Конференция "Основная" » Как узнать, сколько копий приложения запущенно?
Есть новые Нет новых   [134487   +1][b:0.001][p:0.001]