Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
Space
-
- Combo-маньяк

-
-
- Сообщения: 818
- Зарегистрирован: 11.01.2007 (Чт) 1:19
- Откуда: Украина
Space » 30.10.2008 (Чт) 20:05
Если программа завершается некорректно, созданный ею мьютекс остаётся висеть в памяти. Как следующему запущенному экземпляру программы определить, существует ли родитель, создавший мьютекс?
-
alibek
-
- Большой Человек

-
-
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 31.10.2008 (Пт) 9:16
Насколько я помню, мютекс убивается, когда убивается родитель.
Lasciate ogni speranza, voi ch'entrate.
-
Space
-
- Combo-маньяк

-
-
- Сообщения: 818
- Зарегистрирован: 11.01.2007 (Чт) 1:19
- Откуда: Украина
Space » 31.10.2008 (Пт) 10:57
нет. Создай мьютекс, нажми на Стоп. Второй экземпляр проги не запустится.
- Код: Выделить всё
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Sub Form_Load()
Dim sTemp As String, hMutex As Long
sTemp = "MyMutex"
hMutex = CreateMutex(ByVal 0&, 1, sTemp)
If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then Unload Me
End Sub
-
alibek
-
- Большой Человек

-
-
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 31.10.2008 (Пт) 11:08
И кто же, по твоему, в данном случае родитель?
Читай писание:
The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.
Lasciate ogni speranza, voi ch'entrate.
-
Space
-
- Combo-маньяк

-
-
- Сообщения: 818
- Зарегистрирован: 11.01.2007 (Чт) 1:19
- Откуда: Украина
Space » 31.10.2008 (Пт) 12:20
т.е. ты хочешь сказать, как бы не завершилась моя прога, мьютекс будет удалён?
-
Antonariy
-
- Повелитель Internet Explorer

-

-
- Сообщения: 4824
- Зарегистрирован: 28.04.2005 (Чт) 14:33
- Откуда: Мимо проходил
-
Antonariy » 31.10.2008 (Пт) 12:45
Он хочет сказать, что родитель мютекса в данном случае VB6.EXE, а не твоя прога. По кнопке "стоп" он завершает интерпретацию твоей проги, а не собственную работу.
Лучший способ понять что-то самому — объяснить это другому.
-
Space
-
- Combo-маньяк

-
-
- Сообщения: 818
- Зарегистрирован: 11.01.2007 (Чт) 1:19
- Откуда: Украина
Space » 31.10.2008 (Пт) 12:53
ну и Бог с ним. Важно, останется ли мьютекс в памяти после некорректного завершения моего exe-шника.
-
Antonariy
-
- Повелитель Internet Explorer

-

-
- Сообщения: 4824
- Зарегистрирован: 28.04.2005 (Чт) 14:33
- Откуда: Мимо проходил
-
Antonariy » 31.10.2008 (Пт) 13:25
Это что, до сих пор не понятно?
Лучший способ понять что-то самому — объяснить это другому.
-
tyomitch
-
- Пользователь #1352

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 31.10.2008 (Пт) 14:27
Кто-нибудь, погуглите WAIT_ABANDONED
А родитель мутекса действительно нигде не сохраняется.
-
Twister
-
- Теоретик

-

-
- Сообщения: 2251
- Зарегистрирован: 28.06.2005 (Вт) 12:32
- Откуда: Алматы
-
Twister » 04.11.2008 (Вт) 10:07
Важно, останется ли мьютекс в памяти после некорректного завершения моего exe-шника.
Только если у кого-то остался незакрытым хэндл мьютекса. Родителя мьютекса документированными способами узнать не получится, хотя должен сохраняться в заголовке соответствующего объекта в ядре.
А я все практикую лечение травами...
-
tyomitch
-
- Пользователь #1352

-

-
- Сообщения: 12822
- Зарегистрирован: 20.10.2002 (Вс) 17:02
- Откуда: חיפה
tyomitch » 04.11.2008 (Вт) 12:47
Twister писал(а):Важно, останется ли мьютекс в памяти после некорректного завершения моего exe-шника.
Только если у кого-то остался незакрытым хэндл мьютекса. Родителя мьютекса документированными способами узнать не получится, хотя должен сохраняться в заголовке соответствующего объекта в ядре.
А откуда уверенность, что таки-сохраняется?
-
Twister
-
- Теоретик

-

-
- Сообщения: 2251
- Зарегистрирован: 28.06.2005 (Вт) 12:32
- Откуда: Алматы
-
Twister » 04.11.2008 (Вт) 14:44
А откуда уверенность, что таки-сохраняется?
Вот же память-то, а...

Помню, выясняли мы это с тобой когда-то, но я опять попутал - в структуре KMUTANT есть поле OwnerThread (текущий хозяин мьютекса), но не более. И при инициализации его создатель ни где не запоминается:
- Код: Выделить всё
typedef struct _KMUTANT {
DISPATCHER_HEADER Header;
LIST_ENTRY MutantListEntry;
struct _KTHREAD *OwnerThread;
BOOLEAN Abandoned;
UCHAR ApcDisable;
} KMUTANT, *PKMUTANT, *PRKMUTANT, KMUTEX, *PKMUTEX, *PRKMUTEX;
VOID
KeInitializeMutant (
__out PRKMUTANT Mutant,
__in BOOLEAN InitialOwner
)
/*++
Routine Description:
This function initializes a kernel mutant object.
Arguments:
Mutant - Supplies a pointer to a dispatcher object of type mutant.
InitialOwner - Supplies a boolean value that determines whether the
current thread is to be the initial owner of the mutant object.
Return Value:
None.
--*/
{
PLIST_ENTRY ListEntry;
KIRQL OldIrql;
PRKTHREAD Thread;
//
// Initialize standard dispatcher object header, set the owner thread to
// NULL, set the abandoned state to FALSE, and set the APC disable count
// to zero (this is the only thing that distinguishes a mutex from a mutant).
//
Mutant->Header.Type = MutantObject;
Mutant->Header.Size = sizeof(KMUTANT) / sizeof(LONG);
if (InitialOwner == TRUE) {
Thread = KeGetCurrentThread();
Mutant->Header.SignalState = 0;
Mutant->OwnerThread = Thread;
KiLockDispatcherDatabase(&OldIrql);
ListEntry = Thread->MutantListHead.Blink;
InsertHeadList(ListEntry, &Mutant->MutantListEntry);
KiUnlockDispatcherDatabase(OldIrql);
} else {
Mutant->Header.SignalState = 1;
Mutant->OwnerThread = (PKTHREAD)NULL;
}
InitializeListHead(&Mutant->Header.WaitListHead);
Mutant->Abandoned = FALSE;
Mutant->ApcDisable = 0;
return;
}
Так что сорри

А я все практикую лечение травами...
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, SemrushBot, Yandex-бот и гости: 6