C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Частный случай..., Как определить до показа формы, что(+)
** Harold
Отправлено: 23.05.2005, 23:49


Не зарегистрирован







Ресурс, который Форма собирается занять Прога (типа, СОМ-порт, который уже по-делу занят более ранним экземпляром Проги... и тогда "все в сад", даже без Application->MessageBox...)?
Сейчас имеем, что по умолчанию Form->Visible=false, а true, если-мол СОМ-порт открылся (иначе "все в сад").. Но, не работает... Что делать?
1. Поспать. На пожелания Заказчиков — ЗАБИТЬ.
2. Разобраться, а не смотреть на "голых баб" (в прямом и переносном смысле...)
3. ???

Кто как решает ЭТОТ вопрос (риторический, конечно же....) smile.gif
Георгий
Отправлено: 24.05.2005, 00:41


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



может я не по конца понял проблему, но открываем Project.cpp и сразу после строчки
CODE
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
пишем проверки глобальных мутексов или как их там и, если что не нравится, то просто return 666; а вот всякие visible = false для главной формы как то не очень красиво..
** Harold
Отправлено: 24.05.2005, 01:24


Не зарегистрирован







Понимаю, что не ГУД, НО..
Мьютексы не катят, т.к. нужно проверить занятость конкретного СОМ-порта — т.е. хочется проверить ВОЗМОЖНОСТЬ использования экземпляром Проги еще не занятого конкретного СОМ-порта (который может быть уже занят).
Ранее использовалась доп. "приблуда", в которую при запуске передавался номер уже заюзанного СОМ-порта и тогда, любой экземпляр отсылался еще до начала "железных" проверок.

Минус — доп."приблуда". НЕКАШЕРНО.

StandartUser'ам трудно объяснять — лучше решить до этого... а то они норовят сделать "DoubleClick" по панели "быстрого запуска"(или как там ЕЁ??)...

ДОВОЛЬНЫЙ КОНЕЧНЫЙ USER — бОльшая половина успеха, как это ни прискорбно...

Но, в конечном итоге, Прогами пользуются User'ы — а их действия НЕПРЕДСКАЗУЕМЫ...
Rius
Отправлено: 24.05.2005, 07:54


Мастер участка

Группа: Участник
Сообщений: 321



1. При запуске сразу попытаться занять порт и если выскочит ошибка, закончить программу с кодом 666 smile.gif
2. Не открывать порт до явного пожелания юзера, типа вывести отдельную кнопку. При подключении уже аналогично 1, либо сообщить о занятости порта (у меня сейчас так работает).
Gedeon
Отправлено: 24.05.2005, 08:32


Ветеран

Группа: Модератор
Сообщений: 1742



А что все же мешает вывешивать конкретный мьютекс, а потом проверять при открытии конкретного СОМ-порта?
Stan
Отправлено: 24.05.2005, 10:29


Не зарегистрирован







Может быть Вам имеет смысл ввести запрет запуска второго экземпляра "Проги"? Или этих экземпляров должно запускаться несколько — каждый на свой COM-порт?
** Harold
Отправлено: 24.05.2005, 10:35


Не зарегистрирован







Хочется, чтобы форму при этом не было видно, т.е. проверка на занятость порта (номер порта берется из ини-файла) должна проходить при невидимой форме, чтобы user, щелкнувший 25 раз по ехе-шнику увидел только один экземпляр проги и не парился потом, какие окно ему закрывать, а какие нет.
Это важно, т.к. если ту же прогу (копия) запустить из другой директории с другими установками СОМ-порта (у копии свой ини-файл), то должны работать 2 экземпляра Проги, каждая через свой порт и т.д.
А то "наплодив" лишних окошек user может и нужное сгоряча закрыть, ведь предупреждения о том, что он сейчас выйдет из проги почти никто не читает, а только потом вспоминают, что предупреждали ведь...
Вот чего-то и не соображу, как лучше... sad.gif
Gedeon
Отправлено: 24.05.2005, 11:15


Ветеран

Группа: Модератор
Сообщений: 1742



Ну так тут мьютексы и завершение проги самое оно.
Запустил юзер прогу в ини которой com1, ищем мьютекс com1_Harold_MegaProga — нашли завершаем прогу, ведь если не показывать окно а просто плодить в памяти проги — очень не хорошо, а вот если нет такого мьютекса открываем порт, создаем мьютекс com1_Harold_MegaProga и работаем.
Аналогично с com2 и т.д. Вы ведь своим мьютексам можете давать любые имена, главное чтоб были достаточно уникальными, но при проверке-то Вы их знаете, вот и все.
Guest
Отправлено: 24.05.2005, 11:16


Не зарегистрирован







QUOTE

Вот чего-то и не соображу, как лучше...  

QUOTE

А что все же мешает вывешивать конкретный мьютекс, а потом проверять при открытии конкретного СОМ-порта?

** Harold
Отправлено: 24.05.2005, 11:23


Не зарегистрирован







Отсутствие образования мешает. sad.gif
Спасибо за советы, пошел читать про мьютексы. smile.gif
** Harold
Отправлено: 24.05.2005, 13:37


Не зарегистрирован







Все получилось, Всем большое спасибо, будем теперь знать, что такое мьютекс. Если кому интересно:
CODE

HANDLE MyMutex;

в обработчике OnFormCreate
{
ReadIniFile();
MyMutex=OpenMutex (MUTEX_ALL_ACCESS, FALSE, "Harolds_Mutex_"+cPort);
 if ( MyMutex != 0 )
 {
  // Уже есть экземпляр, работающий через порт имени сPort
  CloseHandle(MyMutex);
  Application->Terminate();
  }
  else
  {
  MyMutex=CreateMutex (NULL, FALSE, "Harolds_Mutex_"+cPort);
  }
}
Ну, и на выходе из Проги

  ReleaseMutex(MyMutex);
  CloseHandle(MyMutex);

Вернуться в Вопросы программирования в C++Builder