** Harold |
Отправлено: 23.05.2005, 23:49 |
|
Не зарегистрирован
|
Ресурс, который Форма собирается занять Прога (типа, СОМ-порт, который уже по-делу занят более ранним экземпляром Проги... и тогда "все в сад", даже без Application->MessageBox...)?
Сейчас имеем, что по умолчанию Form->Visible=false, а true, если-мол СОМ-порт открылся (иначе "все в сад").. Но, не работает... Что делать?
1. Поспать. На пожелания Заказчиков — ЗАБИТЬ.
2. Разобраться, а не смотреть на "голых баб" (в прямом и переносном смысле...)
3. ???
Кто как решает ЭТОТ вопрос (риторический, конечно же....) |
|
Георгий |
Отправлено: 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
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 может и нужное сгоряча закрыть, ведь предупреждения о том, что он сейчас выйдет из проги почти никто не читает, а только потом вспоминают, что предупреждали ведь...
Вот чего-то и не соображу, как лучше... |
|
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 |
|
Не зарегистрирован
|
Отсутствие образования мешает.
Спасибо за советы, пошел читать про мьютексы.
|
|
** 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);
| |
|