:: Архив конференции по VFP до 2005 года
Re: Как закрыть семафор?
Каратаев
Автор

Сообщений: 3978
Откуда: Алматы
Дата регистрации: 04.12.2001
Цитата:
Такое ощущение, что семафор вешается на сам VFP и закроется при выхоте из него.
Видимо так и есть
Цитата:
А чего у тебя хэнл семафора 0 а не переменная ? Да и не думаю что хэндл может быть нулем ? Тебе видими как и мне в отпуск пора. А в Уфу поедешь ?
Чуть подправил - код привожу ниже. В отпуск очень хоцца... Насчет Уфы точно не знаю, но вряд ли... Контора мани не даст, а своих не хватит
Цитата:
Полный код в студию
Значит так... это класс... при запуске
#DEFINE STANDARD_RIGHTS_REQUIRED 983040
ON ERROR RETURN .F.
LOCAL gcStartPath AS Character, ghSmp AS Integer
* Путь к приложению - слэши заменяем на восклицательные знаки для
* передачи параметра во внешние функции Win32 API
gcStartPath = STRTRAN(This.Tekdir, "\", "!")
********* Обявление внешних функций Win32 API *********
DECLARE INTEGER OpenSemaphore IN kernel32;
INTEGER dwDesiredAccess, INTEGER bInheritHandle,;
STRING lpName
DECLARE INTEGER CreateSemaphore IN kernel32;
STRING @lpSemaphoreAttrib, INTEGER lInitialCount,;
INTEGER lMaximumCount, STRING lpName
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
*******************************************************
* Проверяем существование семафора с именем, равным полному пути к EXE-файлу приложения
ghSmp = OpenSemaphore(STANDARD_RIGHTS_REQUIRED, 0, gcStartPath )
* Если семафор найден, возвращаем .F. - приложение уже запущено
IF ghSmp <> 0
MESSAGEBOX("Приложение " + STRTRAN(gcStartPath, "!", "\") + " уже запущено!", 48 + 4096, "Ошибка", 3000)
ON ERROR
RETURN .F.
ENDIF
* Создаем семафор с именем, равным полному пути к EXE-файлу приложения
ghSmp = CreateSemaphore (0, 1, 1, gcStartPath)
RELEASE gcStartPath, ghSmp
ON ERROR
* Возвращаем .T. - запускается первый экземпляр приложения
RETURN .T.

И при выходе...
#DEFINE STANDARD_RIGHTS_REQUIRED 983040
LOCAL gcStartPath AS Character, ghSmp AS Integer
* Путь к приложению - слэши заменяем на восклицательные знаки для
* передачи параметра во внешние функции Win32 API
gcStartPath = STRTRAN(This.Tekdir, "\", "!")
********* Обявление внешних функций Win32 API *********
DECLARE INTEGER OpenSemaphore IN kernel32;
INTEGER dwDesiredAccess, INTEGER bInheritHandle,;
STRING lpName
DECLARE INTEGER ReleaseSemaphore IN kernel32;
INTEGER hSemaphore,;
INTEGER lReleaseCount,;
INTEGER @ lpPreviousCount
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
*******************************************************
* Проверяем существование семафора с именем, равным полному пути к EXE-файлу приложения
ghSmp = OpenSemaphore(STANDARD_RIGHTS_REQUIRED, 0, gcStartPath )
IF ghSmp > 0
= ReleaseSemaphore (ghSmp ,1,0)
ENDIF
А включаешь - не работает... (М. Жванецкий)




------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
oleg_km

Сообщений: 487
Откуда: СПб
Дата регистрации: 02.12.2002
Должно быть так:

DEFINE CLASS CEvent AS Custom
nHandle = 0
PROCEDURE Init
LPARAMETERS cMyProc
DECLARE INTEGER OpenEvent IN Win32Api ;
INTEGER, INTEGER, STRING
DECLARE INTEGER CreateEvent IN Win32Api ;
INTEGER, INTEGER, INTEGER, STRING
THIS.nHandle = OpenEvent(2, 0, cMyProc)
IF THIS.nHandle != 0
RETURN .F.
ENDIF
THIS.nHandle = CreateEvent(0, 0, 0, cMyProc)
ENDPROC
PROCEDURE Destroy
CloseHandle(THIS.nHandle)
ENDPROC
ENDDEFINE

Тогда при открытии приложения создаешь объект класса CEvent с параметром "ИмяТвоегоПриложения". Если объект не создался - уже запущено. При закрытии - удаляешь. Или перетиащи код в свой класс. Использование Event, Mutex, Semaphore в данном случае абсолютно не играет никакой роли.

PS. Код приведен не для копирования, а для понимания принципа работы. Нужно правильно обработать ошибки, и вроде как в объявлениях должен быть не INTEGER а LONG



Отредактировано (10.02.05 17:26)


------------------
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
Каратаев
Автор

Сообщений: 3978
Откуда: Алматы
Дата регистрации: 04.12.2001
oleg_km
Че то он в этом варианте позволяет повторный запуск программы...



Отредактировано (11.02.05 10:17)


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
oleg_km

Сообщений: 487
Откуда: СПб
Дата регистрации: 02.12.2002
Ты именно класс используешь? Переменная с объектом этого класса живет весь период приложения или локальная в ините. Должно быть так:

DEFINE CLASS CApp AS CUSTOM
oEvent = .F.
PROCEDURE Init
THIS.oEvent = CREATEOBJECT('CEvent', 'MyProc')
IF VARTYPE(THIS.oEvent) != 'O'
MESSAGEBOX('Уже запущено')
... Какие-то действия
ENDIF
... Ля-ля-ля
ENDPROC
ENDDEFINE
При завершении приложения должна релизиться переменная goApp, тогда свойство oEvent тоже прибъется. Ну или переработай код как тебе удобнее.
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
WiRuc

Сообщений: 1012
Дата регистрации: 09.04.2002
Во-первых, для этих целей лучше использовать mutex.
Во-вторых, неправильно работаете с семафорами.
Надо так:
hSem = CreateSemaphore(NULL,1,1,'SemName')
IF hSem>0 AND GetLastError()=183
* Семафор уже существует
CloseHandle(hSem)
return .F.
ENDIF
* Тело программы
CloseHandle(hSem)
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
Каратаев
Автор

Сообщений: 3978
Откуда: Алматы
Дата регистрации: 04.12.2001
Цитата:
Ты именно класс используешь?
У меня этот код прописан в моем классе. Я вроде разобрался со всеми моментами - все заработало... единственное, что не смог сделать в этом варианте, так это развернуть первый экземпляр приложения при попытке запустить второй. Сообщение,
что типа уже запущено - не очень вдохновляет... а ShowWindow() здесь не проходит, пеотому, что хендл Event-а не соответствует хендлу запущенного приложения.

Цитата:
Во-первых, для этих целей лучше использовать mutex.
Во-вторых, неправильно работаете с семафорами.
Честно говоря, я вообще не понимаю что такое семафор, а что мутекс - делаю вслепую... Если нетрудно, можно доходчиво в пару фраз объяснить различия? И чем лучше Mutex?

С семафорами я пробовал - в ехе-шнике все нормально отрабатывает, а вот из под среды фокса нет. Ну... это выше уже было. Правда Ваш вариант еще не пробовал, похоже он будет работать и из под среды.

Однако развертывание первого экземпляра приложения в обоих этих вариантах мне кажется проблематичным, если учесть, что заголовок окна может динамически меняться...




------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Саня
Цитата:
если учесть, что заголовок окна может динамически меняться...
В том примере как раз все отлицно для меняющегося заголовка - рабочий варинат




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
Вадим! Еще лучше использовать именованные Mutex' ы

тут описано как - я использую именно их.

kodu.neti.ee



Отредактировано (11.02.05 14:59)


------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Приблизительно так и сделано - а то я подумал может какой другой есть CreateMutex




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Как закрыть семафор?
oleg_km

Сообщений: 487
Откуда: СПб
Дата регистрации: 02.12.2002
Абсолютно все равно, что использовать - событие, мутант или семафор, т.к. в данном случае используется их общее свойство - диспетчер объектов ядра отслеживает уникальность их имен

По поводу разворачивания. Этот способ (через объекты ядра) не предусматривает получение описателей окон других экземпляров приложения, а именно они нужны для разворачивания предыдущего экземпляра. Это реализуется вариантом с использованием FindWindow, как это было описано выше.
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 14 (Гостей: 14)

© 2000-2024 Fox Club 
Яндекс.Метрика