IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Как работать с мьютексами в VB .Net? (https://www.imho.ws/showthread.php?t=67594)

SwiMMeR 03.09.2004 05:50

Как работать с мьютексами в 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


iam_xor 08.09.2004 11:58

наколка....
есть фукция така GC.KeepAlive

SwiMMeR 08.09.2004 12:03

iam_xor
поясни, плиз

V@nya 08.09.2004 16:24

SwiMMeR, глянь здесь: http://www.gotdotnet.ru/DotNet/FAQ/C...terop/457.aspx
Тока там на C# но перевести на VB 2 секунды.

Jasper 09.09.2004 01:52

Вот е мое ! Через mutex проверять запущенное приложение ! В жизни бы не додумался ! Че - нет способов попроще ? :)

dyr_farot 09.09.2004 11:06

во первых: куда уж проще
а во вторых этот -- наиболее надежный ( и быстрый )

iam_xor 09.09.2004 12:13

Код:

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

вот собсно и усё

Jasper 09.09.2004 13:30

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

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

Сорри - видел в работе API - впечетлился, использую :yees:

dyr_farot 09.09.2004 13:38

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

а CreateMutex() это что не API?

Jasper 09.09.2004 14:00

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

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

Ты спрашиваешь зачем нужны mutex'ы в ситуации когда оба поцесса/потока пытаются обратится к одному и тому же адресу в памяти ? Или КАК создается новый процесс/поток ?

dyr_farot 09.09.2004 14:05

нет. я говорю что определение запущенности второго экземпляра приложения это та же проблема синхронизации и ее логичнее решать с помощью семафора

Jasper 10.09.2004 05:01

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

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

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

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

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

Вот так то ! :beer:


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

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