Форум » Clipper » Определить , что программа уже выполняется » Ответить

Определить , что программа уже выполняется

Avf: Как в Clipper определить, что программа уже выполняется ? (DOS)

Ответов - 6 новых

LYSK: DOS - однопользовательская среда. запустить 2 экземпляра программы в реальном ДОС - мало реально) если речь идет о том, чтобы узнать что программа уже запущена в другом ДОС-окне, то первое что приходит на ум - это сетевая блокировка какого-нибудь файла или таблицы. Блокировать этот ресурс в начале работы и освобождать в конце. Второй запуск не сможет заблокировать этот же ресурс. Ну, и далее вариации на ту же тему - т.е. нужно разруливать ситуацию в рамках одного рабочего места, или во всей сети... -Успехов!

Avf: Sorry, запущено несколько копий одной и той же программы в DOS-окнах Windows XP ? Вариант с файлами не есть ответ на вопрос. ( К примеру, программы могут быть различные и обращаться к одному и тому же файлу).

Dima: Avf пишет: К примеру, программы могут быть различные и обращаться к одному и тому же файлу Если это Ваши программы то ответ уже озвучил LYSK


LYSK: тогда надо точнее формулировать задачу!) а именно, что нужно определять запущен ли еще "свой" экземпляр, или какой-то другой программы. Средствами Windows - можно. Не выходя за рамки ДОС - вряд ли.

Andrey: Примерно также и я делал раньше. Допустим запускаю программу MyProga.exe В начале программы ставишь функцию опроса EXENAME() Ставишь ОБРАБОТЧИК ошибок.... Создаешь в этом же каталоге базу с одним полем EXENAME() + ".dbf" и открываешь эту базу в МОНОПОЛЬНОМ режиме. Если базу открыть нельзя, то уже ПЕРВАЯ копия программы запущена !!! Вывешиваешь сообщение, что MyProga.exe уже запущена !!! Только иногда даже в ХР бывают (редко) глюки, когда прога вылетает, файл не разблокируется (Windows не скидывает блокировку), тогда приходиться перезагружать компьютер. У меня юзеры привыкли..

PRG_MAN: Так и быть, дарю: При входе If (nStartFLG:=ExclOpenFile(-1,'C:\'+PosRepl(Token(ExeName(),'\:'),'.flg'),.t.,,.F.))==-1 Quit EndIf При выходе ExclOpenFile(nStartFLG,'C:\'+PosRepl(Token(ExeName(),'\:'),'.flg')) //=========================================================================== Func ExclOpenFile(pHandl,pFile,pMsg,pCreat,lShared) Local Ret:=-1, ShMode pMsg := if(pMsg ==Nil,.f.,pMsg) pCreat := if(pCreat ==Nil,.t.,pCreat) lShared := if(lShared==Nil,.f.,lShared) ShMode:=if(lShared,64,16) If pHandl == -1 If File(pFile) Ret := FOpen(pFile,2+ShMode) //RW - Exclusive Else If pCreat.AND.(Ret:=FCreate(pFile,0))!=-1 FClose(Ret) Ret:=FOpen(pFile,2+ShMode) EndIf EndIf If pMsg If Ferror()=5 BotWarnMess('Вы уже работаете с этой программой. Повторный запуск невозможен',.t.,3) ElseIf Ferror()=2 .or. Ferror()=3 BotWarnMess('Неуспешная регистрация входа в программу. FError='+AllTrim(Str(FError())),.t.,3) EndIf EndIf Else FClose(pHandl) EndIf Return Ret



полная версия страницы