Не получается
С SaveDialog получается, но...
Задача на потоки. В одном из потоков необходимо данные Memo сохранять в текстовый файл. Как?
Сохранение данных Memo, ...в файл *.txt без SaveDialog |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Сохранение данных Memo, ...в файл *.txt без SaveDialog |
Jill |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: 0 |
Не получается
С SaveDialog получается, но... Задача на потоки. В одном из потоков необходимо данные Memo сохранять в текстовый файл. Как? |
hardcase |
Сообщение
#2
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Вот мой вариант работы с нитками (так называть предпочтительнее потому как может возникнуть путаница со стримами):
Исходный код // решение классической задачи о поставщике // и получателе (в классическом варианте используются // два семафора) const //имя файла, куда будем сохранять RECORD_FILE = 'file.txt'; // класс нашей записи type TSaveRecord = class private fLine: string; public constructor Create; property Line: string read fLine; end;//of class // в конструкторе втупую создаём новую строку // ты можешь заменить на всё, что тебе нужно var i: integer = 1; constructor TSaveRecord.Create; begin fLine:='Text record #'+IntToStr(i); inc(i); end; var // текущая запись Rec: TSaveRecord = nil; // это специальный объект, который позволяет синхронизировать // чтение/запись в переменную Rec Mtx: TMultiReadExclusiveWriteSynchronizer; // наш потребитель - получает новую запись // и сохраняет в файл type TRecordSaver = class(TThread) private fStream: TStream; procedure UpdateMemo; procedure WriteRec; public procedure Execute; override; end;//of class // процедура отображает новую запись в Memo // компонент на форме procedure TRecordSaver.UpdateMemo; begin Form1.Memo1.Lines.Add(Rec.Line); end; // процеура чтения новой записи procedure TRecordSaver.WriteRec; var S: string; begin // бликируем Rec для изменения из поставщика Mtx.BeginRead; try if Rec = nil then Exit; // переходим к блоку finally если Rec пуста // пишем в файл S:=Rec.Line+#13#10; fStream.WriteBuffer(pointer(S)^,Length(S)); //отображаем в Мемо Synchronize(UpdateMemo); // Rec нам больше не нужна FreeAndNil(Rec); finally // не забываем разблокировать Mtx.EndRead; end; end; procedure TRecordSaver.Execute; begin // открываем файл для записи fStream:=TFileStream.Create(RECORD_FILE,fmCreate or fmOpenWrite); try while not Terminated do begin WriteRec; // небольшая задержка Sleep(100); end; finally fStream.Free; end; end; // наш поставщик type TRecordGenerator = class(TThread) private procedure GenerateRec; protected procedure Execute; override; end;//of class procedure TRecordGenerator.GenerateRec; begin // блокируем Rec для чтения из другого потока Mtx.BeginWrite; try // создаём новую запись if Rec = nil then // предыдущая запись прочитана Rec:=TSaveRecord.Create; finally // снимаем блокировку Mtx.EndWrite; end; end; procedure TRecordGenerator.Execute; begin while not Terminated do begin GenerateRec; // опятьже задержка Sleep(100); end; end; var Saver: TRecordSaver; Generator: TRecordGenerator; procedure TForm1.FormCreate(Sender: TObject); begin // создали синхронизатор Mtx:=TMultiReadExclusiveWriteSynchronizer.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin Button2.Click; end; procedure TForm1.Button1Click(Sender: TObject); begin //защита от дурака if (Saver <> nil) or (Generator <> nil) then Exit; // создали потребителя Saver:=TRecordSaver.Create(true); // создали пославщика Generator:=TRecordGenerator.Create(true); Memo1.Clear; // поехали!!! Saver.Resume; Generator.Resume; end; procedure TForm1.Button2Click(Sender: TObject); begin // уничтожаем поставщика if Generator <> nil then begin Generator.Terminate; Generator.WaitFor; FreeAndNil(Generator); end; // уничтожаем потребителя if Saver <> nil then begin Saver.Terminate; Saver.WaitFor; FreeAndNil(Saver); end; end; На форму положить: Memo - 1 штук; Button - 2 штуки; также подсоединить событие создания формы и разрушения (в моем коде они определены) Сообщение отредактировано: volvo - -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Текстовая версия | 8.05.2024 1:18 |