Вверх ↑
Этот топик читают: Гость
Ответов: 4621
Рейтинг: 746
#16: 2018-03-07 17:30:23 ЛС | профиль | цитата
Запусти мой консольный пример из обычной консоли и пиши в неё сколько хочешь данных - она спокойно ожидает данных сколько нужно, пока не впишешь 'quit'. Выходит, у тебя данные либо где-то теряются и не приходят, либо ты их не дожидаешься.

--- Добавлено в 2018-03-07 17:43:06

1) Возьми большой текстовый файл. В конце добавь строку quit и перевод строки.
2) Скомпилируй эту программку:

Add(Console,2953706,56,105)
{
Title="Console read"
link(onStart,7839409:doEvent1,[])
}
Add(LineBreakEx,7207913,-49,105)
{
Caption="write"
Type=1
link(OnEvent,5526268:doStrCat,[])
}
Add(DoData,16003574,448,77)
{
Data=String(Receiving... Type 'quit' to exit.\n)
link(onEventData,6736747:doWork,[])
}
Add(Hub,11466443,371,112)
{
link(onEvent1,16003574:doData,[(412,118)(412,83)])
link(onEvent2,1368819:doStart,[])
}
Add(LineBreakEx,6736747,497,77)
{
Caption="write"
}
Add(InfoTip,14734582,161,21)
{
Info=#17:Не даём программе|23:завершиться без команды|
Width=169
Height=186
}
Add(WaitObject,13558677,280,140)
{
link(ObjHandle,14477716:ObjHandle,[])
}
Add(Events,14477716,280,70)
{
Name=""
}
Add(Hub,7839409,175,105)
{
OutCount=3
link(onEvent1,14477716:doCreate,[(205,111)(205,76)])
link(onEvent2,11466443:doEvent1,[])
link(onEvent3,13558677:doWait,[(205,125)(205,146)])
}
Add(LineBreakEx,15618268,224,77)
{
Caption="exit"
Type=1
link(OnEvent,14477716:doSet,[])
}
Add(LineBreakEx,2579876,1099,266)
{
Caption="write"
}
Add(StrCat,8640077,1057,266)
{
Str1="Out>>> "
link(onStrCat,2579876:doWork,[])
}
Add(Thread,1368819,679,119)
{
link(onExec,1735145:doRepeat,[])
}
Add(Repeat,1735145,791,119)
{
Op1=Integer(1)
Op2=Integer(1)
link(onRepeat,1149992:doValue,[])
}
Add(LineBreakEx,11811734,854,91)
{
Caption="read"
Type=2
}
Add(Memory,1149992,854,119)
{
Point(Data)
link(onData,4880918:doCompare,[])
link(Data,11811734:getVar,[])
}
Add(If_else,4880918,931,119)
{
Op1=String(quit)
link(onTrue,4930522:doEvent1,[])
link(onFalse,12772073:doData,[(982,132)(982,202)])
}
Add(Hub,4930522,1071,119)
{
link(onEvent1,12924904:doWork,[(1097,125)(1097,104)])
link(onEvent2,3851202:doWork,[])
}
Add(LineBreakEx,12924904,1113,98)
{
Caption="stop"
}
Add(LineBreakEx,15242824,735,126)
{
Caption="stop"
Type=1
link(OnEvent,1735145:doStop,[])
}
Add(LineBreakEx,3851202,1113,126)
{
Caption="exit"
}
Add(DoData,12772073,1001,196)
{
link(onEventData,7344735:doStrCat,[])
link(Data,1149992:Value,[(1007,174)(860,174)])
}
Add(InfoTip,7530493,651,42)
{
Info=#52:Ожидание ввода от пользователя в параллельном потоке|26:и выдача обратно в консоль|
Width=526
Height=207
}
Add(LineBreakEx,16443504,56,154)
{
Caption="read"
Type=3
link(_Data,2953706:Read,[])
}
Add(StrCat,5526268,7,105)
{
Str2="\n"
link(onStrCat,2953706:doWrite,[])
}
Add(InlineCode,4153675,1106,196)
{
WorkPoints=#7:doWrite|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, KOL, Share, Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|23: FStream: PStream; |9: public|20: Str: THI_Event;|28: onResult: THI_Event; |0:|54: procedure doWrite(var _Data: TData; Index: Word);|5: |24: constructor Create;|34: destructor Destroy; override;|5: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|15: FStream.Free;|12: inherited;|4:end;|0:|0:|62:procedure THiAsmClass.doWrite(var _Data: TData; Index: Word); |3:var|12: S: string;|5:begin|34: S := ReadString(_Data, Str, '');|69: if FStream = nil then FStream := NewWriteFileStream('console.log');|33: FStream.Write(S[1], Length(S));|4:end;|0:|4:end.|
}
Add(StrCat,7344735,1057,196)
{
Str2="\r\n"
link(onStrCat,4153675:doWrite,[])
}

3) Открой консоль в папке с программой, кинь рядом большой текстовый файл
4) Запусти:
testprog.exe < bigfile.txt
5) Получишь рядом файл console.log с содержимым поданного файла - ничего не теряется. Я проверял на файле KOL.pas размером в 2.1 МБ

Редактировалось 4 раз(а), последний 2018-03-07 17:46:11
карма: 26

0
Ответов: 655
Рейтинг: 18
#17: 2018-03-07 17:50:41 ЛС | профиль | цитата
Netspirit, да , Ваш пример работает. Но почему с Apache не работает не пойму, все условия соблюдены, все настроено верно. Прием данных через Get работает, через POST только часть данных принимает.
карма: 0

0
Ответов: 4621
Рейтинг: 746
#18: 2018-03-07 17:55:48 ЛС | профиль | цитата
Console.Method должен быть 'Get' - это никак не влияет на Apache, а только на то, чтобы программка не пыталась часть ввода считать при старте, а всё читалось по точке Read. Тем не менее, куда девается остальная часть данных - не понятно. Прицепи к Apache мою последнюю схему (только убери из неё вывод в консоль и добавь таймер или задержку для автоматического завершения). Посмотри содержимое console.log в каталоге с httpd.exe (или где у него там рабочий каталог после запуска).
карма: 26

0
Ответов: 655
Рейтинг: 18
#19: 2018-03-07 17:56:27 ЛС | профиль | цитата
Netspirit, пардон! Работает! пишет данные в файл. А как конец данных определить? Я получаю длину из заголовков. Мне как раз требуется сравнить если количество принятых данных=длина из заголовков то закончить запись.

Т.е. я получаю переменные окружения Apache и там есть Content-Lenght вот мне нужно считать данные этой длины, а то сейчас получается так...допустим данные АБС, а в файл запишется АБССССССССССССС

Редактировалось 2 раз(а), последний 2018-03-07 17:58:11
карма: 0

0
Ответов: 4621
Рейтинг: 746
#20: 2018-03-07 17:59:52 ЛС | профиль | цитата
Используй DataAccumulator на выходе из консоли: сначала накапливаешь заголовки (по разделителю \r\n\r\n), парсишь Content-Length и накапливаешь по длине.

Редактировалось 1 раз(а), последний 2018-03-07 18:00:18
карма: 26

0
Ответов: 655
Рейтинг: 18
#21: 2018-03-07 18:07:50 ЛС | профиль | цитата
Netspirit, спасибо! И еще вопрос! Чем принципиально отличается чтение данные в Ваших Pipes от Console? Я так понимаю используются одни и те же функции Windows API?
карма: 0

0
Ответов: 4621
Рейтинг: 746
#22: 2018-03-07 18:18:11 ЛС | профиль | цитата
Да. Вопрос в качестве кода и в двух подходах: блокирующее чтение (когда функция чтения не возвращает управления до поступления данных, как точка Console.Read) и асинхронное (у меня используется механизм Overlapped, в WinExec - функция PeekNamedPipe()). Набор функций там разнообразный.

Редактировалось 1 раз(а), последний 2018-03-07 18:20:51
карма: 26

0
22
Сообщение
...
Прикрепленные файлы
(файлы не залиты)