![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
1. Удалить первые строки из обоих файлов.
2. Писать строку в конец одного файла из двух. В Memo1 пишет 'Строки удалены', один раз. В Memo2 никаких изменений. В самих файлах соответственно новых строк не появляется. В чём ошибка? Код:
procedure TMyThread1.Execute;
begin
CriticalSection.Enter;
while not Terminated do
Synchronize(Work1);
CriticalSection.Leave;
end;Код:
procedure TMyThread1.Work1;
begin
f:=TStringList.Create();
p:=TStringList.Create();
f.LoadFromFile('myFile1.htm');
p.LoadFromFile('myFile2.htm');
if (f.Count>0) and (p.Count>0) then
begin
f.Delete(0);
p.Delete(0);
end;
f.SaveToFile('myFile1.htm');
p.SaveToFile('myFile2.htm');
f.Free;
p.Free;
Form1.Memo1.Text:='Строки удалены';
end;Код:
procedure TMyThread2.Execute;
begin
CriticalSection.Enter;
while not Terminated do
Synchronize(Work2);
CriticalSection.Leave;
end;Код:
procedure TMyThread2.Work2;
var
l:string;
o:byte;
begin
f:=TStringList.Create();
Randomize;
If Random(20) > 10 Then l:='myFile1.htm' Else l:='myFile2.htm';
f.LoadFromFile(l);
f.Append('Новая строка');
f.SaveToFile(l);
f.Free;
Form1.Memo2.Text:='Добавленная строка №'+inttostr(o);
end;Код:
procedure TForm1.Button1Click(Sender: TObject); begin CriticalSection:=TCriticalSection.Create; MyThread1 := TMyThread1.Create(True); MyThread1.FreeOnTerminate := True; MyThread1.Priority := tpIdle; MyThread1.Resume; MyThread2 := TMyThread2.Create(True); MyThread2.FreeOnTerminate := True; MyThread2.Priority := tpIdle; MyThread2.Resume; end; |
|
#2
|
|||
|
|||
|
А зачем так сложно. да еще и с потоками???
Код:
function Remove0Line(AFileName : String) : Boolean;
var
L : TStingList;
begin
Result := False;
Try
L := TStringList.Create;
Try
L.LoadFromFile(AFileName);
L.Delete(0);
L.Savetofile(AFilename);
Result := True;
Finally
L.Free;
End;
Except
// Hide
End;
end;
function AddLine(AFilename : String) : Boolean;
var
L : TStingList;
begin
Result := False;
Try
L := TStringList.Create;
Try
L.LoadFromFile(AFileName);
L.Add('Новая строка');
L.Savetofile(AFilename);
Result := True;
Finally
L.Free;
End;
Except
// Hide
End;
end;
procedure TForm1.Timer1Timer(Sender : TObject);
begin
Timer1.Enabled := False;
Try
If Remove0Line('MyFile1.txt')
Then Memo1.Lines.add('строка удалена')
Else Memo1.Lines.Add('ошибка удаления строки');
If Remove0Line('MyFile2.txt')
Then Memo2.Lines.add('строка удалена')
Else Memo2.Lines.Add('ошибка удаления строки');
If AddLine('MyFile2.txt')
Then Memo2.Lines.add('строка добавлена')
Else Memo2.Lines.Add('ошибка добавления строки');
Finally
Timer1.Enabled := True;
End;
end; |
|
#3
|
|||
|
|||
|
Спасибо за полный листинг, но мне обязательно нужно использовать потоки.
|
|
#4
|
|||
|
|||
|
Код:
procedure TMyThread.Execute;
begin
while not Terminated do begin
CriticalSection.Enter;
Synchronize(Work);
CriticalSection.Leave;
Sleep(1000);
end;
end;Ошибка в том, что какой-то поток, захватив критическую секцию, крутится, пока не завершится приложение, а его напарник не получает шанса на исполнение (Sleep поставлен только для наглядности). Ну и с логикой чтения-записи как-то не совсем понятно... |
|
#5
|
|||
|
|||
|
Спасибо, уже разобрался.
|