| imho.ws |
![]() |
|
|
|
# 1 | ||
|
::VIP::
Отыпный Саводод Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Как работать с мьютексами в VB .Net?
Долго парился ... не могу найти проблему ....
Суть задачи проста, а именно нужно написать процедуру, которая проверяла бы запущено ли приложение. В VFP эту проблему решал и решил успешно через мьютексы. Теперь возникла та же проблема в Басике .Нет написал следующее: Код:
Public Sub Start_Alone()
If OpenMutex(1, False, "qq") > 0 Then
MsgBox("Программа уже запущена!", 16, "")
End
Else
Dim S_A As SECURITY_ATTRIBUTES
CreateMutex(S_A, True, "qq")
End If
End Sub
не работает в том смысле, что мьютекс создается (потому что результат выполнения CreateMutex больше нуля), но результат выполнения OpenMutex всегда равен нулют.е. я запускаю прогу с месаджем и она ждет нажатия копки ок (мессадж вызывается после создания мьютекса) ... потом запускаю второй экземпляр проги и она создает новый мьютекс, потому что не видит первого GetLastError показывает код 2 типа File_not_found ... В чем проблема? И есть ли альтернативные способы решения задачи в Басике .Нет? Решение проблемы ![]() )оказалось проблема была в другом месте ... описание функции CreateMutex было взято следующее Цитата:
надо было сделать так Цитата:
Код:
Public Sub Start_Alone() If OpenMutex(1, False, "qq") > 0 Then End Else Dim s_a as string CreateMutex(s_a, True, "qq") End If End Sub
__________________
The Information will be FREE! Последний раз редактировалось SwiMMeR; 03.09.2004 в 05:47. |
||
|
|
|
|
# 4 |
|
Full Member
Регистрация: 20.07.2002
Адрес: Находка
Сообщения: 740
![]() ![]() ![]() ![]() ![]() ![]() |
SwiMMeR, глянь здесь: http://www.gotdotnet.ru/DotNet/FAQ/C...terop/457.aspx
Тока там на C# но перевести на VB 2 секунды. |
|
|
|
|
# 7 |
|
Junior Member
Регистрация: 08.09.2004
Сообщения: 50
![]() ![]() |
Код:
Module MainModule
Public app As New ApplicationContext()
Public frm As New MainForm()
Sub Main()
Dim MutexCreated As Boolean
Dim Mutex As System.Threading.Mutex
Mutex = New System.Threading.Mutex(True, "Some_Fuckin_Instance", MutexCreated)
If Not MutexCreated Then
MessageBox.Show("Приложение уже запущено", "Бла Бла Бла", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
app.MainForm = frm
frm.Show()
Application.Run(app)
GC.KeepAlive(Mutex)
end sub
end module
вот собсно и усё |
|
|
|
|
# 8 |
|
Guest
Сообщения: n/a
|
Честное слово - до сих пор думал что mutex'сы созданы для того чтоб решать проблемы многопоточных программ (кто и когда, в какую очередь и т.д)
А проблемы нахождения запушенных программ до сих пор решал через API функции (даже если надо было найти собственную программу я бы все равно забурился бы в API чем полез в mutex) Сорри - видел в работе API - впечетлился, использую |
|
|
# 10 |
|
Guest
Сообщения: n/a
|
ОК - сорри насчет API (че то я погорячился
) Я имел в виду API функции как .FindWindow или .FindProcess (или как там это называется)А насчет процессов - не понял ![]() Ты спрашиваешь зачем нужны mutex'ы в ситуации когда оба поцесса/потока пытаются обратится к одному и тому же адресу в памяти ? Или КАК создается новый процесс/поток ? |
|
|
# 12 |
|
Guest
Сообщения: n/a
|
Ок - поясню себя:
То что ты имешь в виду: Некто Василий (процесс) встает бухой в ж*** с бодуна и не помнит как это зовут и главное если есть в комнате кто то еще с таким именем. Для этого у него есть паспорт (семафор) который он начинает разглядывать у всех находящихся в комнате пока не найдет свой собственный у себя же в кармане и тогда он узнает что он тот самый - The One. Я же советую обратится к жене (API .FindProcess) чтобы она сказала если есть еще кто то с таким именем в комнате. То что я имею в виду: Некто Василий и его товаришь Федор хотят погладить (изменить на подходящие слово) девушку. Для этого каждый из них держит светофор. И только девушка будет решать кто из них и в какую очередь будет ее гладить (наверное на основание цвета на светофоре) Вот так то !
|