![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Спасибо, уже разобрался.
|