powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: построчное чтение данных из памяти
49 сообщений из 49, показаны все 2 страниц
Lazarus: построчное чтение данных из памяти
    #39856405
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мужики,
понадобилось читать и писать вывод запускаемой внешней программы (примерно как в этом примере ) в наследник TStrings построчно , а не прочтенными блоками. Причем чтение должно осуществляться из пополняемого в это время контейнера/памяти (а не как в выше приведенном примере, после окончания отработки внешней программы).

Подскажите, плз, в каком направлении двигаться? Может ссылки на материал, который можно почитать?
=================
Док.

Win7 Ultim x64/Deb 10 (MATE; gtk3) amd64:
FB 3.0.4.33054, Lazarus 2.1(r.61313); FPC 3.3.1 (r.42151), IBX by -Rik-
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856409
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Так в примере же есть поблочное чтение. Остаётся только найти окончание строки и скопировать её. Если читаешь на виндах, то вывод необходимо сначала перекодировать OemToAnsi.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856417
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТак в примере же есть поблочное чтение.
в примере все телодвижения начинаются лишь после того, как запись в память закончена, а мне бы понять, как из постоянно пополняемого MemoryStream читать и парсить строки. Пока не догоняю...
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856422
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Вот там чтение блока:
Код: pascal
1.
BytesRead := AProcess.Output.Read(Buffer, BUF_SIZE);


Блок прочитал, ищи конец строки. Не нашёл, складывай данные в накопительный буффер. Нашёл - клади часть данных до маркера новой строки в накопительный буффер и конвертируй накопительный буффер в строку. Накопительный буффер сделай строковым:
Код: pascal
1.
2.
3.
4.
type
 OEMString = type AnsiString(CP_OEMCP);
var
 accBfr : OEMString;


Потом строку получишь приведением типа: string(accBuf);
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856425
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя процедура выделения строки. Для дельфей.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
//
Procedure TBuilder.ParseDccOutput(Const ABuffer; ACount : Integer);
Var

 CPos       : MarshaledAString; // PAnsiChar;
 Index      : Integer;
 StartIndex : Integer;

 //
 Procedure _AccBuffer(AIndex : Integer);
 Var

  IncSize : Integer;
  OldSize : Integer;

 Begin

  IncSize := AIndex - StartIndex;

  If IncSize > 0 Then
   Begin

    OldSize := Length(FBuffer);
    SetLength(FBuffer, OldSize + IncSize);

    CopyMem(PByte(@ABuffer) + StartIndex, PByte(FBuffer) + OldSize, IncSize);

   End;

  StartIndex := AIndex + 1;

 End;
 //

 //
 Procedure _ProcessLine;
 Begin

  _AccBuffer(Index);

  Try

   ProcessDccLine(String(FBuffer)); // Твоя обработка готовой строки

  Finally

   FBuffer := ''; // тот самый накопительный буфер

  End;

 End;
 //

Begin

 CPos       := @ABuffer;
 Index      := 0;
 StartIndex := 0;

 For Index := 0 To ACount - 1 Do
  Begin

   Case CPos[Index] Of

    #10 : Begin

           If FLastChar = 13 Then
            Inc(StartIndex)
           Else
            _ProcessLine;

          End;

    #13 : _ProcessLine;

   End;

   FLastChar := Ord(CPos[Index]); // FLastChar : Byte;

  End;

 _AccBuffer(ACount);

End;
//

...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856436
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

спасибо, смотрю...
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856750
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Memory Mapped File

Вроде как даже рекомендованный способ совместного доступа к одному файлу. Или он базируется на нем.

В свое время накатал исходник по расширению менеджера памяти для датасета. Собирался к лазарю прикрутить... Но вот времени не было сделать, а теперь уже бывший дельфиец...
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856975
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть же TStringReader
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39856992
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarрасширению менеджера памяти для датасетане поясните о чем речь?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857011
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

обычно автомат делают

несмотря на всю теорию, на практике в простейших случаях как этот, это обычно набор Case в которых происходит установка текущего состояния

у вас ещё и под разные платформы, так что стоит сразу заложиться на все возможные разделители #13, #10, #10#13


если номер строчки неважен, то можно считать любой из символов #13 или #10 разделителем и если аддитивный буфер непустой считать его новой строкой
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857034
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)у вас ещё и под разные платформы, так что стоит сразу заложиться на все возможные разделители #13, #10, #10#13


sLineBreak же.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857040
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

даже мелкомягкие иногда просто #13 или #10 скидывают, и такие сбои нужно обрабатывать корректно
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857052
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)стоит сразу заложиться на все возможные разделители #13, #10, #10#13
В моём варианте, как раз, поддерживается #10, #13, #13#10.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857060
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

спасибо за пинок в нужном направлении. Правда, для простоты я реализовал через строки, а не через указатели (скорость выполнения дял меня не критична, в моих задачах не планируется длинный вывод). Выглядит примерно так (пояснения в тексте для себя-склеротика и нубов, которые будут читать код после меня. "Лишние" переменные остались после отладки, в итоговом коде почищу)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
procedure TForm1.btnGoClick(Sender: TObject);
{$IFDEF MSWINDOWS}
type
  WinCpString = type AnsiString(CP_ACP);//uses LConvEncoding
{$ENDIF}
const
  BUF_SIZE = 1024*2; // Размер буфера для чтения выходных данных блоками
var
  {$IFDEF MSWINDOWS}
  Buffer: WinCpString = '';
  {$ELSE}
  Buffer: string = '';
  {$ENDIF}

  DebugStr: String = '';//отладочная строка
  BufferStr: String = '';//буфер-накопитель
  BytesRead: LongInt = 0;//кол-во считанных из буфера байт
  LineEndingPos: Integer = 0;//позиция начала перевода строки
  StrPartLineEndingAhead //часть строки до LineEnding
  , StrPartLineEndingBehind //часть строки после LineEnding
                :String;
  StrCounter: Integer = 0;//счетчик выводимых memoOutput строк
begin
  memoOutput.Clear;

  {$IFDEF MSWINDOWS}
  // В Windows команду dir нельзя использовать напрямую, потому что она является встроенной
  // командой оболочки. Поэтому нужны cmd.exe и дополнительные параметры
  AProcess.Executable := 'c:\windows\system32\cmd.exe';
  AProcess.Parameters.Add('/c');
  AProcess.Parameters.Add('dir /s c:\Windows\System32\drivers');
  {$ENDIF}
  {$IFDEF UNIX}
  AProcess.Executable := '/bin/ls';
  AProcess.Parameters.Add('--recursive');
  AProcess.Parameters.Add('--all');
  AProcess.Parameters.Add('-l');
  {$ENDIF}

  AProcess.Options := [poUsePipes, poStderrToOutPut, poNoConsole];

  //Запуск процесса (выполнение команды dir/ls)
  AProcess.Execute;

  StrPartLineEndingAhead:= '';
  StrPartLineEndingBehind:= '';
  repeat
    memoOutput.Lines.BeginUpdate;
    try
      SetLength(Buffer,BUF_SIZE);//задаем минимальный размер Buffer (как правило размер Pipes в ОС не превышает 2kB)
      BytesRead := AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;
      if BytesRead > 0
      then
        begin
          SetLength(Buffer,BytesRead);
          DebugStr:= CP1251ToUTF8(Buffer);//uses LConvEncoding

          {LineEnding - алиас для sLineBreak:
          Win = #13#10
          Unix = #10
          Mac OS до v.9 = #13}

          //получаем позицию LineEnding в строке
          LineEndingPos:= UTF8Pos(LineEnding,CP1251ToUTF8(Buffer)); //uses LazUTF8

          if LineEndingPos > 0
          then
            repeat
              if LineEndingPos = 1 //LineEnding в начале строки
              then
                begin
                  StrPartLineEndingAhead:= UTF8Copy(DebugStr,1, UTF8Length(LineEnding));//по сути присвоим пустую строку ''
                  Inc(StrCounter);
                  memoOutput.Lines.Add(Format('%d.',[StrCounter]));//добавляем в memoOutput пустую строку
                end
              else //LineEnding не в начале строки
                begin
                  StrPartLineEndingAhead:= UTF8Copy(DebugStr,1, LineEndingPos - 1);//захватываем часть строки до LineEndingPos;
                  BufferStr:= BufferStr + StrPartLineEndingAhead;// добавляем к строке-буферу захваченный до LineEnding текст
                  Inc(StrCounter);
                  memoOutput.Lines.Add(Format('%d. %s',[StrCounter, BufferStr]));//пишем буфер-накопитель в memoOutput
                  BufferStr:= '';//и "обнуляем" его для следующей итерации
                end;

              //захватываем оставшуюся часть строки после LineEndingPos без символов LineEnding
              StrPartLineEndingBehind:= UTF8Copy(DebugStr,LineEndingPos + UTF8Length(LineEnding), UTF8Length(DebugStr));

              DebugStr:= StrPartLineEndingBehind;
              LineEndingPos:= UTF8Pos(LineEnding,DebugStr);
            until LineEndingPos = 0
          else //LineEnding в DebugStr отсутствует 
            begin
             BufferStr:= BufferStr + DebugStr;
             Inc(StrCounter);
             memoOutput.Lines.Add(Format('%d. %s',[StrCounter, BufferStr]));//пишем строку-буфер в memoOutput
            end;
        end;
    finally
      memoOutput.Lines.EndUpdate;
      memoOutput.SelStart := UTF8Length(memoOutput.Text);
    end;
    Sleep(10);
    Application.ProcessMessages;
  until BytesRead = 0;
end;      


Возможно, есть ошибки в коде. Если найду, поправлю.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857113
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Хапнешь горя, когда дефотные строки перестанут быть байтовыми.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857123
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, не помешает наверное ещё и по таймауту забирать то, что ещё не завершено #10, #13, #13#10.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857195
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyХапнешь горя, когда дефолтные строки перестанут быть байтовыми.
можно подробнее, о каких строках речь и какими они станут? НЕ ОДНОбайтовыми, ты имеешь ввиду?

Мимопроходящийкстати, не помешает наверное ещё и по таймауту забирать то, что ещё не завершено #10, #13, #13#10
не совсем догнал - где?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857243
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докможно подробнее, о каких строках речь и какими они станут? НЕ ОДНОбайтовыми, ты имеешь ввиду?
О дефолтном String, он будет юникодовым в ближайшей перспективе.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857276
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2019 15:09, Kazantsev Alexey пишет:
> О дефолтном String, он будет юникодовым в ближайшей перспективе.

в Лазаре utf8.
а Док на нём и сидит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857279
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2019 14:25, Док пишет:

МП>> кстати, не помешает наверное ещё и по таймауту забирать то, что ещё не завершено #10, #13, #13#10
> не совсем догнал - где?

если я правильно понял твою задачу, ты тащишь данные, которые процесс вываливает в консоль по "трубе".
может так случиться, что ты получил из "трубы" последовательность, которая не заканчивается #10, #13, #13#10
а процесс, который ты отслеживаешь, ничего больше не шлёт (пока).
в этом случае ты этого кусочка можешь ждать ооооооочень долго...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857283
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Строковый тип определяется не лазарем, а в фпц он скоро будет юникодовым по дефолту.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857296
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, уже и лазарь готовится к utf-16.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857301
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The goal of FPC project is [/b]to create a Delphi compatible UnicodeString (UTF-16) based solution[/b], but it is not ready yet. It may take some time to be ready.

This UTF-8 solution of LCL in its current form can be considered temporary. In the future, when FPC supports UnicodeString fully in RTL and FCL, Lazarus project will provide a solution for LCL that uses it. At the same time the goal is to preserve UTF-8 support although it may require changes to string types or something. Nobody know the details yet. We will tell when we know...

In essence LCL will probably have 2 versions, one for UTF-8 and one for UTF-16.

Так что, использование конкретизированного строкового типа не просто доброе пожелание, это маст хэв.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857309
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дважды дибилы!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857325
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийможет так случиться, что ты получил из "трубы" последовательность, которая не заканчивается #10, #13, #13#10
так я в коде вроде бы учел этот момент. Нет?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
          if LineEndingPos > 0
          then
            repeat
            <skiped>
            until LineEndingPos = 0
          else //LineEnding в DebugStr отсутствует 
            begin


Не уверен, но repeat..until в операторные скобки заключать же не надо?

зы. вообще, я пишу для себя кроссплатформенную утилитку с использованием gbak/gfix/gstat/isql - покатаю код еще там...

Kazantsev AlexeyТак что, использование конкретизированного строкового типа не просто доброе пожелание, это маст хэв.
если я правильно тебя понял, все упирается в то, какого типа строка в фпц на момент сборки кода.

Ну дык я же везде повтыкал UTF8-аналоги функций работы со строками, которые корректно работают как с UTF8, так и с ansi. Наверняка, в момент перехода на utf16 окончательно обновятся и аналогичные UTF16-функции, которые (весьма вероятно) будут корректно работать со всеми ansi/utf8/utf16 строками. Вся беда в том, что
автор...Nobody know the details yet. We will tell when we know...

Или я не так тебя понял и опять чего-то не догоняю?

ps. надеюсь #13 и #10 при любой погоде остануться однобайтными
. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857345
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...
ps. надеюсь #13 и #10 при любой погоде остануться однобайтными
. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.
Напрасно надеешься :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857346
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докps. надеюсь #13 и #10 при любой погоде остануться однобайтными
. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.вход с консоли останется тот же, однобайтный - тут ничего не поменяется надеюсь
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857357
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докесли я правильно тебя понял, все упирается в то, какого типа строка в фпц на момент сборки кода.
Именно. У тебя под буфер для винды используется конкретизированный тип, а для прочих систем дефолтный. Однако, буфер то байтовый.

Кстати, у тебя там поиск маркера конца строки сможет обработать ситуацию, когда пара #13#10 будет разделена?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857358
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, зря ты со строками связался...
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857360
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокМужики,
понадобилось читать и писать вывод запускаемой внешней программы...
Задача именно в такой постановке? Нельзя что-то более вменяемое для обмена данными организовать?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857371
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyКстати, у тебя там поиск маркера конца строки сможет обработать ситуацию, когда пара #13#10 будет разделена?
так вот, почему у тебя сначала #13 ищется, а потом #10. Таки придется от строк отказываться


ёёёёёНельзя что-то более вменяемое для обмена данными организовать?
ты меня спрашиваешь? Название топика читал? Это я спросил совета, в надежде на твой ответ :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857374
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2019 16:34, Док пишет:

МП>> может так случиться, что ты получил из "трубы" последовательность, которая не заканчивается #10, #13, #13#10
> так я в коде вроде бы учел этот момент. Нет?

я твой код не вижу.
ты его в спойлер прячешь.
по NNTP оно не отображается.
а вообще, спойлеры для того, чтоб в них прятать женскую половую письку.
а не код, на техническом форуме.

> зы. вообще, я пишу для себя кроссплатформенную утилитку с использованием gbak/gfix/gstat/isql - покатаю код еще там...

все эти "кроссы" от лукавого.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857395
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийты его в спойлер прячешь.
по NNTP оно не отображается.
"вон оно че, Михалыч" ©

а я пальцы и колесико мышки читающих берегу. Не люблю портянки кода на 3 экрана :)

Мимопроходящийвсе эти "кроссы" от лукавого.
ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857409
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2019 17:31, Док пишет:

МП>> все эти "кроссы" от лукавого.
> ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает :)

но gbak-и то есть и для линуха, и для винды.
а под яось нет и не будет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857428
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийно gbak-и то есть и для линуха, и для винды.
а под яось нет и не будет.
сегодня для меня день открытий :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857737
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanне поясните о чем речь?
На тот случай, когда из базы приходит больше двух(четырех) гигов.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857739
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокМимопроходящийвсе эти "кроссы" от лукавого.
ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делаетда вполне типичная ситуация для кучи проектов к-е из одной кодовой базы собираются и работают как под вынь так и хрюндиксы. я вот сервисы и туда и сюда собираю из vs, правда ни разу не морды так что иосы к счастью не беспокоят
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857743
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarНа тот случай, когда из базы приходит больше двух(четырех) гиговлюбопытно, жаль на посмотреть не выложено ведь?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857804
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanлюбопытно, жаль на посмотреть не выложено ведь?
stanilarНо вот времени не было сделать, а теперь уже бывший дельфиец...

Нет, как уже было сказано, не выложено. Но время было интересное. Был молод, думал что знания о том, как работает менеджер памяти равносильно успеху в жизни. Все делал в поте лица. Правда, мне самому так и осталось не понятным, помогло-ли(потому и не стал выкладывать). А теперь уже нет ни времени дальше разбираться, ни желания копаться в том, что больше никогда не понадобится. Осталась только ностальгия по ушедшему без пользы.

P/S/ Могу выслать почтой то, что (возможно) было тем, о чем идет речь. Идея была в том, что DS работает с памятью аналогично TStream. Вот и был сделан наследник TStream для кэша DS, который окном в 64Кб читал/писал кэш. Сам наследник это отдельный компонент, а вот как хакнуть DS из родных библиотек это два сторонних компонента + танцы с бубном.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857821
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarМогу выслать почтой то, что (возможно) было тем, о чем идет речь
в профиле ящик актуальный?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857824
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

Да, только тему нужно написать читаемую, а то этот ящик у меня для всего. Пошел копать исходники
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857852
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilar,
в заголовке sql.ru
если таки разыщется и не жалко то я бы глянул из любопытства о чем речь. спасибо
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857858
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...

ёёёёёНельзя что-то более вменяемое для обмена данными организовать?
ты меня спрашиваешь? Название топика читал? Это я спросил совета, в надежде на твой ответ :)
Ну я не знал, что тебе бэкап/рестор нужен FB. Поди из стартового топика пойми. Я вот в клиентское приложение встроил и бэкап, и рестор. Используя соотв. компоненты библиотеки доступа. И никакого чтения из памяти, десяток строк кода, и все.
Или тебе прямо обязательно именно в твоей постановке задачу решать?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857919
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.09.2019 12:46, ёёёёё пишет:
> Я вот в клиентское приложение встроил и бэкап, и рестор.
> Используя соотв. компоненты библиотеки доступа.

через TIBServices ты НЕ можешь получить бекап с удалённого сервера себе "у папочку" на десктопе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857931
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

это да, но нужно ли сие топикстартеру?

ЗЫ: как-то делал копирование удаленной базы на локальный комп, тоже совсем немного работы: за основу взял пример "клонирование базы" из состава икземплов к UIB. Чуть доточил для фич новой СУБД, результаты сравнивал в DB Comparer.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857989
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёНу я не знал, что тебе бэкап/рестор нужен FB. Поди из стартового топика пойми. Я вот в клиентское приложение встроил и бэкап, и рестор. Используя соотв. компоненты библиотеки доступа. И никакого чтения из памяти, десяток строк кода, и все.
птицын b/r - это частный случай, который запросто решается в случае получения ответа на вопрос стартового топика.

Мимопроходящийчерез TIBServices ты НЕ можешь получить бекап с удалённого сервера себе "у папочку" на десктопе.

Компоненты - оне пишутся компонентописателями. Тот IBX, который сейчас репах Лазаревского OPM, усиленно пилится и даже теперь позволяет динамически грузить клиентскую библу, как это делали ФИБы. Причем, он, автор, разделил свои компоненты условно на legacy (которые позволяли делать b/r только на стороне сервера) и современные (эти теоретически позволяют все), но они еще кривые, автор - обладает весьма большой инертностью и упрямством; пока его убедишь поправить тот или иной косяк, особенно, если он в этом не убежден .... :)

Посему проще написать свою гуишную обертку (к тому же, всегда есть возможность прикрутить к ней все новые фишки). И в простом варианте я это сделал, но хочется большего функционала красивостей, нежели есть в IBE, и проч.проч.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39858007
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
авторптицын b/r - это частный случай, который запросто решается в случае получения ответа на вопрос стартового топика.
Страшно представить, что ты затеял.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39861071
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, наконец-то сегодня руки дошли. Код специально не прячу под спойлер для читающих по NNTP. Кому нетрудно, погоняйте у себя, плз (проект приаттачил) - теоретически должен работать и под стабильные Лазарь и фпц.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
procedure TForm1.btnGoClick(Sender: TObject);
const
  BUF_SIZE = 1024*2; // Размер буфера для чтения выходных данных блоками
  ConstFormatStr = '%d. ~ %s';//строка формата для подстановки вывода текста в мемо
var
{$IFDEF MSWINDOWS}
Buffer: RawByteString = '';
BufferStg: RawByteString = '';//буфер-накопитель
{$ENDIF}
{$IFDEF UNIX}
Buffer: String = '';
BufferStg: String = '';//буфер-накопитель
{$ENDIF}
  StrCounter: Integer = 0;//счетчик выводимых memoOutput строк
  BytesRead: LongInt = 0;//кол-во считанных из буфера байт
  LineEndingPos_13: Integer = 0;//позиция символа возврата каретки #13(CR)
  LineEndingPos_10: Integer = 0;//позиция символа перевода строки #10(CR)
  dt: TDateTime;
begin
  memoOutput.Clear;

  {$IFDEF MSWINDOWS}
  // В Windows команду dir нельзя использовать напрямую, потому что она является встроенной
  // командой оболочки. Поэтому нужны cmd.exe и дополнительные параметры
  AProcess.Executable := 'c:\windows\system32\cmd.exe';
  AProcess.Parameters.Add('/c');
  AProcess.Parameters.Add('dir /s c:\windows\system32');
  {$ENDIF}
  {$IFDEF UNIX}
  AProcess.Executable := '/bin/ls';
  AProcess.Parameters.Add('--recursive');
  AProcess.Parameters.Add('--all');
  AProcess.Parameters.Add('-l');
  {$ENDIF}

  AProcess.Options := [poUsePipes, poStderrToOutPut, poNoConsole];

  //Запуск процесса (выполнение команды dir/ls)
  AProcess.Execute;

  dt:= Now;
  memoOutput.Lines.Add('==== процесс начат: ' + FormatDateTime('dd.mm.yyyy h:mm:ss:zzz am/pm',dt) + ' ====');
  memoOutput.Lines.Add('');

  SetLength(Buffer,BUF_SIZE);//задаем минимальный размер Buffer (как правило размер Pipes в ОС не превышает 2kB)
  BytesRead:= AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;

  repeat
    memoOutput.Lines.BeginUpdate;
    try
      if BytesRead > 0 then
      begin
        SetLength(Buffer,BytesRead);

        {LineEnding - алиас для sLineBreak:
        Win = #13#10
        Unix = #10
        Mac OS до v.9 = #13}

        {$IFDEF MSWINDOWS}
        //получаем позицию #13 в строке
        LineEndingPos_13:= Pos(#13,Buffer);

        repeat
          case LineEndingPos_13 of
            0:
              begin
                BufferStg:= BufferStg + Buffer;
              end;
            1://#13 в начале строки
              begin
                LineEndingPos_10:= Pos(#10, Buffer);

                case (LineEndingPos_10 - LineEndingPos_13) of
                  1: //#10(LF) следует за #13(CR)
                    begin
                      Inc(StrCounter);
                      //сбрасываем буфер-хранилище в memo...
                      memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,WinCPToUTF8(BufferStg)]));

                      //очищаем буфер-хранилище
                      BufferStg:='';

                      //откусываем от начала буфера символы перевода строки #13#10(CRLF)
                      Delete(Buffer,1,2); //... и крутим цикл дальше
                    end;
                  else //после #13(CR) следует любой символ, кроме #10(LF), или нет вообще символов
                    begin
                      //клеим символ возврата каретки #13(CR) к буферу-накопителю
                      BufferStg:= BufferStg + #13;

                      //откусываем от начала буфера символ возврата каретки #13(CR)
                      Delete(Buffer,1,1); //... и крутим цикл дальше
                    end;
                  end;
              end;
            else //#13(CR) в середине или в конце буфера
              LineEndingPos_10:= Pos(#10, Buffer);
              case (LineEndingPos_10 - LineEndingPos_13) of
                1: //#10(LF) следует за #13(CR)
                  begin
                    //копируем часть буфера до #13(CR) в буфер-хранилище
                    BufferStg:= BufferStg + Copy(Buffer,1,LineEndingPos_13 - 1);

                    Inc(StrCounter);

                    //сбрасываем буфер-хранилище в memo...
                    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,WinCPToUTF8(BufferStg)]));

                    //очищаем буфер-хранилище
                    BufferStg:='';

                    //отрезаем спереди часть буфера вместе BufferStg + символами перевода строки #13#10(CRLF)
                    Delete(Buffer,1, LineEndingPos_13 + 1);//... и крутим цикл дальше
                  end;
                else //после #13(CR) следует любой символ, кроме #10(LF), или нет вообще символов
                  begin
                    //клеим его к буферу-накопителю
                    BufferStg:= BufferStg + #13;

                    //откусываем от начала буфера символ возврата каретки #13(CR)
                    Delete(Buffer,1,1);//... и крутим цикл дальше
                  end;
              end;
          end;
          LineEndingPos_13:= Pos(#13,PChar(Buffer));
        until LineEndingPos_13 = 0;
        {$ENDIF}
        {$IFDEF UNIX}
        //получаем позицию #10 в строке
        LineEndingPos_10:= Pos(#10,Buffer);

        repeat
          case LineEndingPos_10 of
            0:
              begin
                BufferStg:= BufferStg + Buffer;
              end;
            1: //#10 в начале строки
              begin
                Inc(StrCounter);
                //сбрасываем буфер-хранилище в memo...
                memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));

                //очищаем буфер-хранилище
                BufferStg:='';

                //откусываем от начала буфера символ перевода строки #10(LF)
                Delete(Buffer,1,1);

                //... и крутим цикл дальше
              end
            else //#10(LF) в середине или в конце буфера
              begin
                //копируем часть Buffer до #10(LF) в буфер-накопитель
                BufferStg:= BufferStg + Copy(Buffer,1,LineEndingPos_10 - 1);

                Inc(StrCounter);
                //сбрасываем буфер-хранилище в memo...
                memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));


                //очищаем буфер-хранилище
                BufferStg:='';

                //отрезаем спереди часть буфера вместе BufferStg + символом перевода строки #10(LF)
                Delete(Buffer,1,LineEndingPos_10);

                //... и крутим цикл дальше
              end;
          end;
          LineEndingPos_10:= Pos(#10,Buffer);
        until LineEndingPos_10 = 0;
        {$ENDIF}
      end;
    finally
      memoOutput.Lines.EndUpdate;
      memoOutput.SelStart := UTF8Length(memoOutput.Text);
    end;
    Sleep(10);
    Application.ProcessMessages;

    SetLength(Buffer,BUF_SIZE);
    BytesRead:= AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;
  until BytesRead = 0;

  //сливаем остатки буфера-накопителя в Мемо
  if Length(BufferStg) > 0 then
  begin
    Inc(StrCounter);
    //сбрасываем буфер-хранилище в memo...
    {$IFDEF MSWINDOWS}
    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));
    {$ENDIF}
    {$IFDEF UNIX}
    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));
    {$ENDIF}

  end;
  dt:= Now;
  memoOutput.Lines.Add('');
  memoOutput.Lines.Add('==== процесс закончен: ' + FormatDateTime('dd.mm.yyyy h:mm:ss:zzz am/pm',dt) + ' ====');
end;



@Kazantsev Alexey

че-та не стал я заморачиваться с байтами (в отладке сложнее), со строками проще, тем более, что StringElementSize для стрингов в *nix'ах равен все равно равен StringElementSize для RawByteString под винды. Если покажешь пример, буду благодарен. :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39861141
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докче-та не стал я заморачиваться с байтами (в отладке сложнее), со строками проще
Чего там отлаживать, прости господи... Хотя, дело хозяйское, конечно.

Доктем более, что StringElementSize для стрингов в *nix'ах равен все равно равен StringElementSize для RawByteString под винды
Пока равен.
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: построчное чтение данных из памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]