Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизПоочерёдная запись в файл двумя разними программами. Найти похожие ветки
← →
Zheks (2004-01-07 19:14) [0]Ув. Мастера!!!, подскажите плз., как поочереди писать в один и тот же файл, двумя разными программами?
← →
DVM (2004-01-07 19:45) [1]Одна открывает файл монопольно (см. параметры CreateFile), другая ждет пока файл не освободится.
← →
Anatoly Podgoretsky (2004-01-07 19:56) [2]Что за файл?
← →
Zheks (2004-01-08 09:14) [3]Спасибо, что уделили мне время...
Задача такая: Нужно что бы первая программа создавала файл и писала в него свои значения, а вторая ждала пока первая отпашет, и вписывала свои значения. Потом включалась опять первая(пр), писала свои значения(2пр. в ожидании пока не запишет первая) и т.д.
Как это осуществить? Помогите пожалуйста!
← →
[lamer]Barmaglot (2004-01-08 09:17) [4]Тебе же ответели. Хотя помоему проще после завершения записи первой программой послать сообщение второй, о том, что запись окончена и т.д.
← →
Zheks (2004-01-08 10:20) [5]Киньте примерчик плз. как это осуществить...
Понимаю это не ваши проблемы но мне в край нужно сделать эту прогу, а то у нас по параллельному программированию препод суровый...
ПЛЗ. поомоогите кто чем может...
← →
TUser (2004-01-08 11:05) [6]Ну, в каждой проге организуй цикл, в котором надо подождать, пока можно будет открыть данный файл для записывания. А потом - записывать.
Более подробно подобные проблемы решаются в книге В.Столлингса "Операционные системы". Там есть решения подобный проблемм через семафоры, мониторы и пр. Препод будет счастлив.
← →
alex_*** (2004-01-08 11:10) [7]Я бы делал через семафоры или event"ы, но это посложнее немного сообщений, хотя гораздо красивее
← →
Zheks (2004-01-08 11:59) [8]Напишите плз., как пользоваться семафорами, как их применять в Delphi...
Спасибо
← →
Тимохов (2004-01-08 12:03) [9]И семаформами и ивентами в дельфи пользоваться точно также как в другом языке. О том, как вообще пользоваться семафорами и ивентами прекрасно описано в msdn.microsoft.com
← →
Zheks (2004-01-08 12:16) [10]Если это и всё, что вы мне можете посоветовать, спасибо, но всё же надеюсь, что ВЫ более подробно распишите, как реализовать поочерёдную запись в файл.
← →
Андрей Сенченко (2004-01-08 12:48) [11]... но все же надеюсь Вы наконец напишите за менгя программу для моего сурового препода ?
А пива сколько ставишь ?
← →
Erik (2004-01-08 13:07) [12]Вобщето симафоры и ивенты неподойдут, так как надо взвимодействовать с разными процесами. А вот Mutex самое то.
Это его создание:
var
ObjName: PChar;
const
UnicName = "Starvara";
begin
GetMem(ObjName, Length(UnicName) + 1);
try
StrCopy(ObjName, UnicName);
Handle := CreateMutex(nil, true, ObjName);
finally
FreeMem(ObjName);
end;
Ожидание:
type
TActiveEvent = (actExit, actSend);
RAction = record
Event: array[TActiveEvent] of THandle;
Call: array[TActiveEvent] of TNotifyEvent;
end;
........
for i := Low(tmEvent.Event) to High(tmEvent.Event) do
begin
tmEvent.Event[i] := сюда надо присвоить нужный HANDLE
end;
...........
Status := WaitForMultipleObjects(Ord(High(tmEvent.Event)) + 1, @tmEvent.Event, false, INFINITE);
Также тебе понадобится OpenMutex() чтобы открыть Mutex в другом процесе.
← →
Erik (2004-01-08 13:11) [13]Надеюсь понятно для чего я структуру RAction написал? Этот шаблон упрощает програмирование. Например после WaitForMultipleObjects можно написать:
Retry:
Status := WaitForMultipleObjects(Ord(High(tmEvent.Event)) + 1, @tmEvent.Event,
false, INFINITE);
if fActive and (TActiveEvent(Status) <> actExit) then
exit;
fActive := True;
try
tmEvent.Call[TActiveEvent(Status)](Self);
finally
FActive := False;
end;
if not Terminated then
goto Retry;
← →
Zheks (2004-01-08 13:14) [14]Андрей, мне не нужно писать всю программу, мне нужен простой кусочек кода который осуществляет эту процедуру. Неужели никто не сталкивался с такой проблемой? Киньте пож. кусочек кода, или ссылочку дайте путёвую по этой теме(msdn.microsoft.com - не предлагать), или прогу в которой эта процедура осуществляется...
Насчёт ПИВА!!!: Да накидаемся, об чём речь???
← →
Андрей Сенченко (2004-01-08 13:14) [15]под словом "Семафор" в общечеловеческом случае понимается некий объект, имеющий в большинстве случаев два возможных отличимых извне состояния, по которым можно судить о возможности либо невозможности совершения каких-либо действий.
В Вашем случае в качестве семафора может быть использован например временный файл или ключ реестра, который будет создаваться одной из Ваших программ на время записи в файл и удаляться сразу послее ее окончания. По наличию этого файла или ключа и можно будет судить о возможности или невозможности писать в файл.
Как уже было сказано, метод не самый оптимальный, но с другой стороны - надежный.
← →
TUser (2004-01-08 13:24) [16]Семафор - общедоступная переменная, которая содержит число процессов в очереди на данный ресурс. Когда новый процесс пытается получить доступ к ресурсу - он работает только, если семафор равен -1. В противном случае значение семафора увеличивается. Когда ресурс высвобождается, то значение уменьшается.
Размести семафор в общедоступной области памяти и юзай.
← →
Zheks (2004-01-08 15:07) [17]Всем Спасибо огромное!!!
Информации набрал, буду разбираться...
← →
panov (2004-01-08 15:30) [18]procedure TForm1.Button2Click(Sender: TObject);
var
hMutex: THandle;
F: TextFile;
begin
hMutex := CreateMutex(nil,True,PChar("??? ??? ?????????"));
if hMutex = 0 then
begin
sb.Panels[0].Text := "Error";
Exit;
end;
if GetLastError = ERROR_ALREADY_EXISTS then
begin
sb.Panels[0].Text := "????";
Application.ProcessMessages;
WaitForSingleObject(hMutex,INFINITE);
sb.Panels[0].Text := "?????????,?????";
end;
sb.Panels[0].Text := "????? ? ????";
Application.ProcessMessages;
AssignFile(F,"test.txt");
if FileExists("test.txt") then Append(F) else Rewrite(F);
WriteLn(F,FormatDateTime("dd.mm.yyyy hh:nn:ss",now));
Flush(F);
CloseFile(F);
sb.Panels[0].Text := "????????? ??????";
Application.ProcessMessages;
Sleep(1000);
ReleaseMutex(hMutex);
CloseHandle(hMutex);
Button2.Click;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c