Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

Создание мьютексов в основном потоке   Найти похожие ветки 

 
TUser ©   (2005-01-17 15:37) [0]

Почему этот код не работает? Есть 2 кнопки с кэпшенами "Create" и "Close". Если кликать на них в порядке "Create-Close-Create-Close-...", то ошибок не происходит. Если два раза подряд попытаться создать мьютекс, то, конечно, получается ERROR_ALREADY_EXISTS. Потом можем нажать Close, ошибку не пишет. Значит мьютекс мы уничтожили (насколько мне позволяют судить мои скромные познания). Потом опять нажмем на Create - и снова получем ERROR_ALREADY_EXISTS. Почему?
Кроме того, если два раза подряд нажать Close (при созданном мьютексе), то пишет "Extaernal error in C0000008", т.е. ошибка происходит внутри CloseHandle. Почему?

var m: cardinal;

{Button1.Caption = "Create"}
procedure TForm1.Button1Click(Sender: TObject);
var c: cardinal;
begin
 SetLastError(NO_ERROR);
 if GetLastError <> NO_ERROR then
   ShowMessage("---");
 m:=CreateMutex(nil,false,"TEST_MUTEX");
 c:=GetLastError;
 if c <> NO_ERROR then
   if c = ERROR_ALREADY_EXISTS then
     ShowMessage("Already exists")
     else
     ShowMessage("Unknown error");
end;

{Button2.Caption = "Close"}
procedure TForm1.Button2Click(Sender: TObject);
begin
 if not CloseHandle(m) then
   ShowMessage("Error");
end;


 
Digitman ©   (2005-01-17 15:49) [1]


> TUser ©   (17.01.05 15:37)  


давай-ка ты сначала не по-чукотски, а по-русски оформишь код :

var m: cardinal;

{Button1.Caption = "Create"}
procedure TForm1.Button1Click(Sender: TObject);
begin
m:=CreateMutex(nil,false,"TEST_MUTEX");
Win32Check(m <> 0);
end;

{Button2.Caption = "Close"}
procedure TForm1.Button2Click(Sender: TObject);
begin
Win32Check(CloseHandle(m));
end;

..

после этого приведи всевозможные секвенции "давки" на кнопки и видимые тобой рез-ты "давки" - тады уже будем обсуждать ..


 
TUser ©   (2005-01-17 16:09) [2]

С "чукотским" кодом
1. Create -> Close -> Create -> Close -> ... - никаких ошибок, все ОК
2. Close [Error, понятно - объекта еще нет]
3. Create -> Create [Already exists, т.к. объект уже есть] -> Close -> Create -> [Already Exists, непонятно - мы создаем объект, которого еще нет, т.к. предыдущий я уничтожил]
4. И вообще, при любом порядке нажимания, если я хоть один раз попытался создавать существующий мьютекс, то в этот момент (и все последующие) - получаю ERROR_ALREADY_EXISTS. После этого также любое нажатие Close дает Extaernal exception.

С "русским" кодом (порядок нажимания тот же)
1. Все ОК
2. [Handle does not exists]
3. Если сколько угодно раз нажать Create - то никаких ошибок нет. Это понятно, GreateMutex вернет хэндл существующего объекта, поэтому m <> 0, а Win32Check не вызовет никакого Raise. Непонятно, почему в таком случае чукотский код хуже русского.
4. Create -> любая последовательность нажатий -> Close -> Close [External exception, хотя должен показать просто "Error"]


Мне непонятны те результаты, которые я подчеркнул. Кто может объяснить?


 
Digitman ©   (2005-01-17 16:17) [3]

"русский" код - это код, полагающийся на автоинтерпретацию Win32-ошибок встроенным механизмом ф-ции Win32Check от БОРЛАНДА)

"чукотский" код полагается  на ОЖИДАЕМЫЕ ЧУКЧЕЙ ошибки, а не на любые возможные ошибки, могущие возникнуть, но не ожидаемые чукчей.


 
TUser ©   (2005-01-17 16:25) [4]

Но зато чукотский код должен (по моим понятниям) видеть, что мутекс уже создан. В русский этого не увидит. Или лучше пользоваться OpenMutex для таких целей вместо CreateMutex/GetLasError?
И что это за External exception?


 
TUser ©   (2005-01-17 16:29) [5]

Вот при такой постанове дела результаты точно такие же, как при [1]. Соотвественно - и вопросы те жу, что и в [2].

var m: cardinal;

procedure TForm1.Button1Click(Sender: TObject);
var c: cardinal;
begin
 m:=OpenMutex(MUTEX_ALL_ACCESS,false,"TEST_MUTEX");
 if m = 0 then begin
   m:=CreateMutex(nil,false,"TEST_MUTEX");
   Win32Check(m <> 0);
   end else
   ShowMessage("Already exists");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if not Win32Check(CloseHandle(m)) then
   ShowMessage("Error");
end;


 
Digitman ©   (2005-01-17 16:35) [6]


> TUser ©   (17.01.05 16:25) [4]
> Но зато чукотский код должен


он ничто никому не должен

он даст мне ПОЛНОЕ понимание происходящего, если ты укажешь в соответствии с
Button1Click (действие СОЗДАТЬ) и Button2Click (действие ЗАКРЫТЬ)
последовательность юзерских действий и то что юзер видит в рез-те конкр.посл-ти на экране.

"что вижу, то и пою" - великая штука !!


 
TUser ©   (2005-01-17 17:01) [7]


> Digitman ©   (17.01.05 16:35) [6]

Я в [2], вроде бы, описал. Create - нажатие на кнопку Create, Close - нажатие на кнопку Close ...


 
REA   (2005-01-17 17:07) [8]

>Потом можем нажать Close, ошибку не пишет. Значит мьютекс мы уничтожили

Или закрыли. (MSDN: The mutex object is destroyed when its last handle has been closed)


 
TUser ©   (2005-01-17 17:27) [9]


> REA   (17.01.05 17:07) [8]

Но тогда не получилось бы ERROR_ALREADY_EXISTS при последующем нажатии на Create, так?


 
Digitman ©   (2005-01-17 17:38) [10]


> TUser ©   (17.01.05 17:27) [9]


ты получил 2 ссылки на один и тот же объект.
объект будет уничтожен лишь после уничтожения обеих ссылок.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.079 c
14-1103997412
Piter
2004-12-25 20:56
2005.02.27
Оцените статью про прокси серверы


1-1108459051
Игорь нтк
2005-02-15 12:17
2005.02.27
неактивная кнопка


14-1107433216
Usser
2005-02-03 15:20
2005.02.27
По поводу ноутбука


6-1103012316
Архитектор
2004-12-14 11:18
2005.02.27
InternetSetOption


1-1107859186
Zloy
2005-02-08 13:39
2005.02.27
Смена модального окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский