Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

Поочерёдная запись в файл двумя разними программами.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
3-63016
Аноним
2003-12-23 05:37
2004.01.20
Выпадающий список


4-63457
Jampir
2003-11-16 20:32
2004.01.20
получение цвета точки рабочего стола


3-63023
Паша_
2003-12-22 19:48
2004.01.20
Сортировка данных


7-63418
ККВ
2003-11-05 13:55
2004.01.20
Буква CD


1-63123
C0rWin
2004-01-10 19:36
2004.01.20
Изменение стилей на лету.