imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 03.09.2004, 05:50     # 1
SwiMMeR
::VIP::
Отыпный Саводод
 
Аватар для SwiMMeR
 
Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452

SwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собой
Как работать с мьютексами в 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 Structure SECURITY_ATTRIBUTES
Dim nLength As Integer
Dim lpSecurityDescriptor As Integer
Dim bInheritHandle As Integer
End Structure

Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Integer, ByVal lpName As String) As Integer
оно оказалось, не совсем верным ...
надо было сделать так
Цитата:
Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As String, ByVal bInitialOwner As Integer, ByVal lpName As String) As Integer
и после этого преобразуя код в следующее все начинает работать
Код:
 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.
SwiMMeR вне форума  
Старый 08.09.2004, 11:58     # 2
iam_xor
Junior Member
 
Аватар для iam_xor
 
Регистрация: 08.09.2004
Сообщения: 50

iam_xor Ушлепокiam_xor Ушлепок
наколка....
есть фукция така GC.KeepAlive
iam_xor вне форума  
Старый 08.09.2004, 12:03     # 3
SwiMMeR
::VIP::
Отыпный Саводод
 
Аватар для SwiMMeR
 
Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452

SwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собойSwiMMeR Имеются все основания чтобы гордиться собой
iam_xor
поясни, плиз
__________________
The Information will be FREE!
SwiMMeR вне форума  
Старый 08.09.2004, 16:24     # 4
V@nya
Full Member
 
Аватар для V@nya
 
Регистрация: 20.07.2002
Адрес: Находка
Сообщения: 740

V@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царстве
SwiMMeR, глянь здесь: http://www.gotdotnet.ru/DotNet/FAQ/C...terop/457.aspx
Тока там на C# но перевести на VB 2 секунды.
V@nya вне форума  
Старый 09.09.2004, 01:52     # 5
Jasper
Guest
 
Сообщения: n/a

Вот е мое ! Через mutex проверять запущенное приложение ! В жизни бы не додумался ! Че - нет способов попроще ?
 
Старый 09.09.2004, 11:06     # 6
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

dyr_farot Нимб уже пробиваетсяdyr_farot Нимб уже пробивается
во первых: куда уж проще
а во вторых этот -- наиболее надежный ( и быстрый )
dyr_farot вне форума  
Старый 09.09.2004, 12:13     # 7
iam_xor
Junior Member
 
Аватар для iam_xor
 
Регистрация: 08.09.2004
Сообщения: 50

iam_xor Ушлепокiam_xor Ушлепок
Код:
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
Фишка в том что GC тупо может порешить наш мьютекс и ему надо явно сказать чтобы он не трогал его

вот собсно и усё
iam_xor вне форума  
Старый 09.09.2004, 13:30     # 8
Jasper
Guest
 
Сообщения: n/a

Smile

Честное слово - до сих пор думал что mutex'сы созданы для того чтоб решать проблемы многопоточных программ (кто и когда, в какую очередь и т.д)

А проблемы нахождения запушенных программ до сих пор решал через API функции (даже если надо было найти собственную программу я бы все равно забурился бы в API чем полез в mutex)

Сорри - видел в работе API - впечетлился, использую
 
Старый 09.09.2004, 13:38     # 9
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

dyr_farot Нимб уже пробиваетсяdyr_farot Нимб уже пробивается
а чем проблема запуска второго процесса отличается от проблемы запуска второго потока? ( ответ -- ничем )

а CreateMutex() это что не API?
dyr_farot вне форума  
Старый 09.09.2004, 14:00     # 10
Jasper
Guest
 
Сообщения: n/a

ОК - сорри насчет API (че то я погорячился ) Я имел в виду API функции как .FindWindow или .FindProcess (или как там это называется)

А насчет процессов - не понял

Ты спрашиваешь зачем нужны mutex'ы в ситуации когда оба поцесса/потока пытаются обратится к одному и тому же адресу в памяти ? Или КАК создается новый процесс/поток ?
 
Старый 09.09.2004, 14:05     # 11
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

dyr_farot Нимб уже пробиваетсяdyr_farot Нимб уже пробивается
нет. я говорю что определение запущенности второго экземпляра приложения это та же проблема синхронизации и ее логичнее решать с помощью семафора
dyr_farot вне форума  
Старый 10.09.2004, 05:01     # 12
Jasper
Guest
 
Сообщения: n/a

Wink

Ок - поясню себя:

То что ты имешь в виду:

Некто Василий (процесс) встает бухой в ж*** с бодуна и не помнит как это зовут и главное если есть в комнате кто то еще с таким именем. Для этого у него есть паспорт (семафор) который он начинает разглядывать у всех находящихся в комнате пока не найдет свой собственный у себя же в кармане и тогда он узнает что он тот самый - The One. Я же советую обратится к жене (API .FindProcess) чтобы она сказала если есть еще кто то с таким именем в комнате.

То что я имею в виду:

Некто Василий и его товаришь Федор хотят погладить (изменить на подходящие слово) девушку. Для этого каждый из них держит светофор. И только девушка будет решать кто из них и в какую очередь будет ее гладить (наверное на основание цвета на светофоре)

Вот так то !
 


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 01:08.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.