Вниз
Скачать: CL | DM;

Вопрос про мьютексы   Найти похожие ветки 

 
Zheks ©   (2004-01-27 10:31) [0]

Есть две программы. В обоих я создаю мьютекс с одинаковым именем. Задача программ поочереди дописывать значения в файл. Проблемма в том, что если я запускаю одну программу, то она не ждя вторую записывает ВСЕ свои значения, а должна ждать отработки второй программы.


 
Bel ©   (2004-01-27 10:54) [1]

А ты уверен, что создаёшь мьютексы с одинаковым именем? Винда не даст тебе создать второй мьютекс с таким же именем.


 
stas ©   (2004-01-27 11:07) [2]

Bel © (27.01.04 10:54) [1]
Помоему
она не даст, но и ошибки не выдаст


 
AKul ©   (2004-01-27 11:07) [3]


> Bel © (27.01.04 10:54) [1]
> Винда не даст тебе создать второй мьютекс с таким же именем.

Это не верно. Вызов функции CreateMutex с именем уже существующего Mutex"а (именно Mutex"а, а не другого объекта ядра), вернет описатель существующего Mutex"a (если, конечно первый Mutex создавался с определенными атрибутами доступа).


> Zheks © (27.01.04 10:31)

Покажи основные участки кода.


 
Erik ©   (2004-01-27 11:13) [4]

to stas
Как это даст?! Ты хочеш сказать, что одна из главных API функций синхронизации невоботает!!!!!! Сначало надо подумать а потом писать. Все отрабатывет коректно, необходимо проверять возвращаемый код ошибки.
Автору вопроса, зачем создовать второй мьютекс? Чем он может помочь? Как я думаю надо открывать его а не создовать. А еще лучше воспользоватся симафором.


 
Bel ©   (2004-01-27 11:16) [5]

> Вызов функции CreateMutex с именем уже существующего Mutex"а вернет описатель существующего Mutex"a

Виноват, был не прав. Ошибки не будет, только проверка GetLastError покажет, что он уже был.

В таком случае солидарен с > AKul © (27.01.04 11:07) [3]
> Покажи основные участки кода.


 
AKul ©   (2004-01-27 11:19) [6]


> Erik © (27.01.04 11:13) [4]


> Автору вопроса, зачем создовать второй мьютекс? Чем он
> может помочь?

Скорее всего, он имел в виду, что первое приложение создает мьютекс, а второе создает мьютекс с таким же именем (т.е. открывает его же).
Но об этом, конечно, лучше спросить у самого автора.


 
Stas ©   (2004-01-27 11:23) [7]

Erik © (27.01.04 11:13) [4]
> она не даст, но и ошибки не выдаст

Где ты видел даст ?
А ошибки явной не выдаст !


 
Zheks ©   (2004-01-27 11:28) [8]

h := CreateMutex(nil, False, "MyExampleMutexProgram");
if h = INVALID_HANDLE_VALUE then begin
ShowMessage("Не могу создать мьютекс");
Exit;
end;

for i := 1 to UpDownCount.Position do begin
if stop then
break;

.........................................

res := WaitForSingleObject(h, 20000);

if res = WAIT_TIMEOUT then begin
ShowMessage("Таймаут ожидания захвата мьютекса");
break;
end
else if res <> WAIT_OBJECT_0 then begin
ShowMessage("Ошибка доступа к мьютексу");
break;
end
else begin

Sleep(UpDownSleep.Position * 1000);
Application.ProcessMessages;

AssignFile(f, fn);
if FileExists(fn) then
Append(f)
else
Rewrite(f);
Write(f, "test");
CloseFile(f);

ReleaseMutex(h);

Sleep(UpDownSleep.Position * 1000);
end;
end;

CloseHandle(h);


 
Zheks ©   (2004-01-27 11:37) [9]

Вообще задача такая: Нужно что бы две программы поочереди писали в один файл.


 
Bel ©   (2004-01-27 11:43) [10]

Ну, вроде никакого криминала здесь нет. Единственное небольшое замечание: если CreateMutex не сможет создать/открыть мьютекс, она вернет NULL, а не INVALID_HANDLE_VALUE.


 
Digitman ©   (2004-01-27 12:18) [11]


> Zheks © (27.01.04 11:37) [9]
> Вообще задача такая: Нужно что бы две программы поочереди
> писали в один файл.


сегодня две, а завтра - косой десяток
может быть, есть смысл реализовать отдельный NT-сервис, который будет монопольно работать с файлом (осуществляя при этом арбитраж поступающих к нему запросов на запись в файл) и с которым будут общаться все будущие программы ?



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.018 c
1-16353
Iron Maiden
2004-01-24 15:03
2004.02.06
Установить Memo в самый конец


1-16318
Darkwing
2004-01-25 13:55
2004.02.06
Процедура неправильно принимает динамический массив.


6-16568
Sil
2003-12-01 17:59
2004.02.06
Моделирование сетей


1-16440
Globoor
2004-01-28 11:15
2004.02.06
сливание документов в один файл


1-16416
Пубертанец
2004-01-22 15:08
2004.02.06
Слияние меню




   Наверх