Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-63085
MikeZ
2004-01-06 17:34
2004.01.20
Дерево компонентов


7-63429
Ivolg
2003-11-03 15:22
2004.01.20
Контекстное меню


6-63271
Samael6
2003-11-13 17:39
2004.01.20
Ядро Internet Explorer


1-63092
Kiril-
2004-01-08 15:21
2004.01.20
case integer of


3-63017
Trad
2003-12-22 21:40
2004.01.20
арифметика с данными из БД





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский