как вариант:
Код:
interface
uses
SyncObjs,
...
implementation
var
CriticalSection: TCriticalSection;
function GetMemo: String;
begin
CriticalSection.Enter;
if Form1.Memo1.Lines.Count>0 then
begin
Result:=Form1.Memo1.Lines[0];
Form1.Memo1.Lines.Delete(0);
end else Result:='';
CriticalSection.Leave;
end;
...
initialization
CriticalSection:=TCriticalSection.Create;
finalization
CriticalSection.Free;
из потоков вызывай GetMemo.
если удалять нельзя, то завести текущий номер строки и в блоке Enter-Leave возвращать строку по номеру и делать номеру инкремент.