Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизВопрос про мьютексы Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c