Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2011, 19:03
YurIbr89 YurIbr89 вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 8
Репутация: 10
По умолчанию Запись и удаление строк

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  
Старый 22.05.2011, 22:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А зачем так сложно. да еще и с потоками???

Код:
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  
Старый 23.05.2011, 09:20
YurIbr89 YurIbr89 вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 8
Репутация: 10
По умолчанию

Спасибо за полный листинг, но мне обязательно нужно использовать потоки.
Ответить с цитированием
  #4  
Старый 23.05.2011, 18:53
kukuruku310 kukuruku310 вне форума
Прохожий
 
Регистрация: 23.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

Код:
procedure TMyThread.Execute;
begin
  while not Terminated do begin
    CriticalSection.Enter;
    Synchronize(Work);
    CriticalSection.Leave;
    Sleep(1000);
  end;
end;

Ошибка в том, что какой-то поток, захватив критическую секцию, крутится, пока не завершится приложение, а его напарник не получает шанса на исполнение (Sleep поставлен только для наглядности). Ну и с логикой чтения-записи как-то не совсем понятно...
Ответить с цитированием
  #5  
Старый 23.05.2011, 21:38
YurIbr89 YurIbr89 вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 8
Репутация: 10
По умолчанию

Спасибо, уже разобрался.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025