Показать сообщение отдельно
  #14  
Старый 02.09.2013, 09:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от babay89
Не то. Там берется ровно столько строк, сколько потоков. А нужно что бы потоки брали строки пока они не кончятся в мемо.

Ну тебе же выше написали как.
Делаешь метод, который возвращает очередную строку из Memo или пустую строку, если строки кончились. Внутри метода надо работать через CriticalSection. Каждый поток для получения данных "дергает" этот метод, если вернулась пустая строка, то завершается (ну или ждет пока не появяться новые данные). Сам метод, в зависимотсти от того, что нужно делать, либо удаляев взятые строки, либо просто запоминает последнюю взятую.

Вот _пример_ второго варианта:
Код:
type
  TMyForm = class(TForm)
    Memo1 : TMemo;
  ...
  private
    FLastProcessedLine : Integer; // поставить в -1 в конструкторе или в OnCreate
  public
    function GetNextLine : String;
  end;

var
  csGetNewLine : TCriticalSection;
...

function TMyForm.GetNextLine : String;
begin
  csGetNewLine.Enter
  Try
    If Memo1.Lines.Count-1 > FLastProcessedLine
      Then
        Begin
          Inc(FLastProcessedLine);
          Result := Memo1.Lines[FLastProcessedLine];
        End
      Else Result := '';
  Finally
    csGetNewLine.Leave;
  End;
end;

...

initialization
  csGetNewLine := TCriticalSection.Create;

finalization
  csGetNewLine.Free;

end.

Как-то так.
Ответить с цитированием