![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Zefick |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.12.2009 Репутация: 1 Всего: 2 |
Su_, я не понимаю, почему Вы отмели идею о занятии порта. Мне она пришла в голову сразу, как только я прочитал название темы (наверное, потому что в универе не так давно была лаба по сетевым приложениям на Java и что будет, если запустить два сервера я отлично помню). К тому же Вы говорите, что порт у вас и так занимается. Вот и замечательно - при второй попытке его занять выбросится исключение, которое надо ловить и передавать фокус в первую программу.
|
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
Сейчас я её реализовал правда на другом порте.,т.к на основной не хочеться кидать, иногда в процессе работы (прием сообщений ) вылетает исключение в ожидание порта ,потом пересоздается. С лок-файлом наиболее красивое решение, не надо занимать сетевой порт ,и не должно висеть порт,что если на этот порт начнут спамить ,и он выкинеть исключение)
|
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
а как передать фокус в первую программу?
|
|||
|
||||
serger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 19.6.2007 Где: Ижевск Репутация: 1 Всего: 5 |
Грубо.
Занятие порта хорошая идея, до тех пор пока есть сеть. В последнее время сеть, правда, уже почти везде... -------------------- упс! |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
а как передать фокус в первую программу?
Добавлено через 1 минуту и 14 секунд в смысле ГРубо? там мегафон интернет который иногда отваливается .. |
|||
|
||||
Su_ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
решил вопрос о восстановление фокуса,правда если через порт делать..
т.е. вешаю порт на сервер, если вылетает исключение шлю на этот же порт connect , а если на этом порту срабатывает accept то он делать
т.е так :
|
||||
|
|||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 11 Всего: 16 |
хороший способ; другой, кросс-платформный, трудно найти я думаю.
|
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
будем тестировать, Важна стабильность)Спасибо всем кто помогал, я думаю топик можно закрыть)
|
|||
|
||||
Viroman |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
http://forum.vingrad.ru/forum/topic-303234.html
В продолжение этой темы, модер поспешил закрыть даже до конца не поняв сути, не конкретно незапуск второй копии, а именно шаринг списка задач, общий блок памяти, или ещё чего нибудь быстрое. Порты занимать уже проходили, не то, глупый вариант, и я о нём уже думал, но видимо больше хороших идей нет :( |
|||
|
||||
Viroman |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Кстати, просто обязан поблагодарить dobrolub за предоставленный код, работает на ура. Только как я понял, дискуссия была по поводу нерабочести под линуском. Так вот, если вдруг столкнётся кто то с этой проблемой вновь, есть одно огромное различие в плане использования этой фишки под виндой и линухом. Дурость заключается в том, что при воспроизведении этого кода System.out.println(new FileOutputStream("xxx").getChannel().tryLock()); на винде файл лочится до конца воспроизведения всей джава машины!!! и работает как надо и ожидается, что так и будет работать, ведь никто лок программно не освобождает. Но на линухе это не работает, как ожидается!!! Фишка заключается в том, что если воспроизвести этот код System.out.println(new FileOutputStream("xxx").getChannel().tryLock()); то система залочит файл, а потом она его тут же разблокирует, к сожалению, и это и явилось подводным камнем и для меня, и похоже для топикстартера!!! Дабы избежать этой проблемы в КОРНЕ, учтите на будущее, запускайте выжеизложенный код как есть с синхронизацией и wait в отдельном потоке и тогда и файл лочится прекрасно и не разлочивается до конца воспроизведения машины, и работает и на винде, линухе, маке итп... Может кому то это поможет, чтобы на те же грабли не наступали.. |
|||
|
||||
koreyko |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 20.4.2010 Репутация: нет Всего: нет |
Здравствуйте, уважаемые форумчане.
Решил не открывать новую тему, т.к. стоит та же задача - сворачивание приложения в трей и его восстановление из трея при попытке запуска второй копии приложения. Задачу блокировки второй копии решил с помощью лок-файла. Осталось передать фокус в запущенную первой копию. Я пробую сделать это через instance ID. Получаю и сохраняю ID в залоченный файл, при запуске второй копии - считываю. Теперь остался последний шаг: достучаться к уже запущенному инстансу через его ID и восстановить окно программы. Подскажите, пожалуйста, как это сделать? Спасибо. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Надо делать, как уже писали выше, все через порт. Приложение при запуске должно запускать сервер, который принимает сокетные соединения на любом свободном порту из заданного диапазона. Приложение должно провести поиск других инстансев соединяясь поочередно к портам из заданного диапазона. Если соединение успешно создано и пароль совпадает, значит два инстанса друг друга нашли и дальше могут обмениваться командами через сокетное соединение. |
|||
|
||||
koreyko |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 20.4.2010 Репутация: нет Всего: нет |
Спасибо, а где можно почитать об этом способе - через порт? Желательно с примерами. После прочтения ветки ясность не наступила, к сожалению.
|
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Примерно так. Запустите этот класс два раза. Когда вторая инстанс стартует, первая закрывается командой System.exit(0). Можно любое другое поведение реализовать.
|
|||
|
||||
koreyko |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 20.4.2010 Репутация: нет Всего: нет |
COVD, спасибо. Вдумчиво изучил Ваш код, но так и не понял -- каким образом я все-таки могу получить из второй запущенной копии доступ к фрейму первой копии? Для того, чтобы развернуть свернутое в трей окно.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |