Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Количество одновременно запущенных приложений


Автор: suomi 21.11.2006, 01:44
Вопрос всегда мучал, как отслеживать количество запущенных GUI-приложений, ну и естно сократить это число жо одного, так что при повторном запуске появилась масага в диалоге - мол приложение запущено уже!

Автор: powerOn 21.11.2006, 10:32
При запуске программы проверяй наличие какого-нибудь файла-метки. Если файл есть, то выдавай сообщение, что мол программа уже запущена... и завершай прогу. 
Если файл-метка отсутствует, то создавай его и продолжай работу. В конце работы программы удали файл-метку.

Автор: LSD 21.11.2006, 11:38
Или слушать некий порт.

Автор: Metal_Heart 21.11.2006, 12:48
powerOn, у твоего метода есть нехорошее место, а именно: 
прога не успела удалить файл метку (сбой проги, сбой jvm, отключили электричество и т.д.)
Тогда такие ситуации придется описывать в инструкции, типа "ручное восстановление ..."

Это я к тому, что вариант LSD намного безопаснее

 smile 

Автор: powerOn 21.11.2006, 13:26
Цитата(Metal_Heart @  21.11.2006,  12:48 Найти цитируемый пост)
powerOn, у твоего метода есть нехорошее место, а именно: 
прога не успела удалить файл метку (сбой проги, сбой jvm, отключили электричество и т.д.)
Тогда такие ситуации придется описывать в инструкции, типа "ручное восстановление ..."

Ну да. Инструкция пригодится. Как раз можно вставить её в сообщение при неудачной загрузке программы.

Цитата(Metal_Heart @  21.11.2006,  12:48 Найти цитируемый пост)
Это я к тому, что вариант LSD намного безопаснее

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


Автор: Metal_Heart 21.11.2006, 15:29
Цитата(powerOn @  21.11.2006,  13:26 Найти цитируемый пост)
А что если порт уже был кем то занят? То прога вообще не запустится...  smile И даже если искать свободный порт, то как об нем узнает вторая копия программы... 


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

Ну, а если при старте проги в каком-то порту есть данные идентифицирующие первый экземпляр проги, то выдавал бы соотв. сообщение

вот  smile 

Автор: w1nd 21.11.2006, 15:37
Порты - это вообще не хорошо. А если у человека совсем отсутствует сетевой интерфейс и службы (включая loopback  smile)?
Файл - надежнее. Только проверять нужно не его наличие, а блокировку.  Eclipse использует именно такой способ и проблем с этим не было ни разу.

Автор: suomi 21.11.2006, 17:15
LSD, хороший вариант! А вот примерчик можно привести, кто должен прослушивать порт - сервер или клиент ? И как определить наличие что программа уже запущена, просто ждать ответа от кого-то или как ?

Автор: Metal_Heart 21.11.2006, 17:18
suomi, как сам придумаешь так и будет  smile  smile  smile 

Автор: LSD 21.11.2006, 18:53
Цитата(w1nd @  21.11.2006,  15:37 Найти цитируемый пост)
Порты - это вообще не хорошо. А если у человека совсем отсутствует сетевой интерфейс и службы (включая loopback  )?

Нужна только поддержка протокола TCP/IP, т.е. начиная с Win2000 и старше это все есть (про Linux я и не говорю).

Цитата(suomi @  21.11.2006,  17:15 Найти цитируемый пост)
LSD, хороший вариант! А вот примерчик можно привести, кто должен прослушивать порт - сервер или клиент ? И как определить наличие что программа уже запущена, просто ждать ответа от кого-то или как ?

Вначале запускаешь проверку на то, что кто-то уже работает по этому порту:
Код
  public static final int START_ADRESS = 5000;
  public static final int END_ADRESS   = 5050;
  public static final byte[] SIGNATURE = {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE};

  public static boolean checkAlreadyRunning()
  {
    try
    {
      InetAddress localhost = InetAddress.getLocalHost();
      for(int port = START_ADRESS; port < END_ADRESS; port++)
      {
        Socket socket = null;
        try
        {
          socket = new Socket(localhost, port);
          DataInputStream in = new DataInputStream(socket.getInputStream());
          byte[] bytes = new byte[SIGNATURE.length];
          in.readFully(bytes);
          try
          {
            socket.close();
          }
          catch(IOException e)
          {}
          if(Arrays.equals(SIGNATURE, bytes))
          {
            return true;
          }
        }
        catch(IOException e)
        {
          if(socket != null)
          {
            try
            {
              socket.close();
            }
            catch(IOException e1)
            {}
          }
        }
      }
    }
    catch(UnknownHostException e)
    {}
    return false;
  }

а затем если никто порт не занял, занимаешь его сам (первый доступный из диапазона).

Автор: <Spawn> 22.11.2006, 08:23
А разве в Java нет доступа к объектам синхронизации ОС? Вроде Mutex, Semaphore? В Delphi легко данная проблема решалась через данные механизмы - незнаю насколько это осуществимо в Java, если нужен кросплатформенный код...

Автор: LSD 22.11.2006, 11:21
Цитата(<Spawn> @  22.11.2006,  08:23 Найти цитируемый пост)
А разве в Java нет доступа к объектам синхронизации ОС?

Нет.

Автор: cube 16.8.2007, 18:58
Цитата(w1nd @ 21.11.2006,  15:37)
Порты - это вообще не хорошо. А если у человека совсем отсутствует сетевой интерфейс и службы (включая loopback  smile)?
Файл - надежнее. Только проверять нужно не его наличие, а блокировку.  Eclipse использует именно такой способ и проблем с этим не было ни разу.

как это можно реализовать? Можно пример...

И еще можно ли сделать так чтобы при втором запуске разворачивался первый интерфейс приложения, как например Нетбинс (при повторном клике на ярлык разворачивается свернутое приложение?)

Автор: _Michael 17.8.2007, 11:34
По-моему http://forum.vingrad.ru/forum/topic-168232.html ета тема уже обсуждалась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)