Да, еще чего подумал -- парсить файл лога -- это хорошо, а не проще мониторить этот файл на ходу, читать добавку и распихивать данные на ходу в каждодневную базу. Я бы так и сделал
------------ Дoбавленo в 23.59:
Tad, слабое быстродействие прямого кода, меня настораживает
------------ Дoбавленo в 00.13:
Проверил обе схемы на этом же файле при отключенном контроле вывода. Прирост схемы Tad-a очень незначительный 24 мсек против моих 26 мсек
Тестовые схемы:
Моя
Add(MainForm,94467,399,378) { Width=750 Height=299 Caption="" } Add(Button,4481738,168,175) { Left=20 Top=235 link(onClick,1555007:doStart,[]) } Add(Thread,1555007,224,175) { Delay=0 FastStop=0 link(onExec,13019582:doEvent1,[]) } Add(Hub,5019261,280,287) { OutCount=5 link(onEvent1,6468069:doOff,[(324,293)(324,349)]) link(onEvent2,15640483:doStart,[(310,300)(310,377)]) link(onEvent3,344370:doConvert,[]) link(onEvent4,15640483:doStop,[(303,314)(303,384)]) link(onEvent5,6468069:doOn,[(318,321)(318,356)]) } Add(LED,6468069,343,336) { Left=615 Top=235 Width=115 Height=20 Shape=1 } Add(TimeCounter,15640483,343,371) { link(onStop,94467:doCaption,[]) } Add(SharedStream,9929879,343,196) { FileName="log1.txt" CoreName="Log" PageMem=1600 Point(Position) link(onOpen,5019261:doEvent1,[(387,202)(387,248)(268,248)(268,293)]) } Add(Convertor,344370,343,301) { Mode=11 link(onResult,10513845:doEvent1,[]) link(Data,9929879:Stream,[]) } Add(StrList,2597292,476,217) { Point(doGetString) Point(onGetString) } Add(Edit,11092326,546,350) { Left=155 Top=235 Width=130 Text="serial" } Add(Hub,13019582,280,175) { OutCount=3 link(onEvent1,9209952:doClear,[(677,181)(677,321)]) link(onEvent2,2279432:doData,[(460,188)(460,405)]) link(onEvent3,9929879:doOpen,[(318,195)(318,202)]) } Add(ArrayEnum,16021318,490,308) { link(onItem,2886579:doSearch,[]) link(Array,2597292:Array,[]) } Add(Hub,10513845,406,301) { link(onEvent1,2597292:doText,[(439,307)(439,244)]) link(onEvent2,16021318:doEnum,[]) } Add(BlockFind,2886579,630,308) { EndBlock=":" Point(doStartBlock) link(onSearch,9209952:doAdd,[]) } Add(DoData,2279432,546,399) { link(onEventData,2886579:doStartBlock,[(589,405)(589,321)]) link(Data,11092326:Text,[]) } Add(ListBox,9209952,693,308) { Left=10 Top=10 Width=720 Height=215 link(Str,16021318:Item,[(699,294)(534,294)(534,352)(496,352)]) }
Приведенная Tad-a
Add(MainForm,94467,343,322) { Width=750 Height=299 Caption="" } Add(Button,4481738,126,224) { Left=20 Top=235 link(onClick,1555007:doStart,[]) } Add(Thread,1555007,175,224) { Delay=0 FastStop=0 link(onExec,5019261:doEvent1,[]) } Add(Hub,5019261,224,224) { OutCount=6 link(onEvent1,9209952:doClear,[(400,230)(400,258)]) link(onEvent2,6468069:doOff,[(268,237)(268,293)]) link(onEvent3,15640483:doStart,[(261,244)(261,321)]) link(onEvent4,3918115:dosearch,[]) link(onEvent5,15640483:doStop,[(253,258)(253,328)]) link(onEvent6,6468069:doOn,[(247,265)(247,300)]) } Add(LED,6468069,287,280) { Left=615 Top=235 Width=115 Height=20 Shape=1 } Add(TimeCounter,15640483,287,315) { link(onStop,94467:doCaption,[]) } Add(Edit,11092326,343,182) { Left=155 Top=235 Width=130 Text="serial" } Add(ListBox,9209952,427,245) { Left=10 Top=10 Width=720 Height=215 } Add(InlineCode,3918115,343,245) { WorkPoints=#8:dosearch| EventPoints=#8:onsearch| DataPoints=#4:text|8:filename| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|30: text,filename:THI_Event;|25: onSearch:THI_Event;|6: |53: procedure doSearch(var Data:TData; index:word);|5: end;|0:|14:implementation|0:|31:procedure THiAsmClass.doSearch;|3:var|14: F: TextFile;|14: S,t: string;|5:begin|30: t:= ReadString(Data, text);|45: AssignFile(F,ReadString(Data, filename)); |12: Reset(F);|26: While Eof(F)<> True do|9: begin|18: Readln(F, S);|53: If pos(t,s)<> 0 then _hi_onEvent(onSearch, S); |8: end;|17: CloseFile(F);|4:end;|0:|0:|0:|15:{var f:PStream;|13: t:string;|31: buf:array[0..4096] of char;|18: len,p:integer;|5:begin|31: t := ReadString(Data, text);|54: f := NewReadFileStream(ReadString(Data, filename));|35: fillchar(buf, sizeof(buf), );|21: len := length(t); |31: while f.position < f.size do|10: begin|52: copymemory(@buf[0], @buf[4096-1 - len], len);|48: p := f.read(buf[len], sizeof(buf) - len);|22: //buf[p] := #0;|24: p := pos(t, buf);|21: while p > 0 do|14: begin|45: _hi_onEvent(onSearch, f.position);|39: p := posex(t, buf, p + len);|13: end;|9: end;|10: f.free;|6:end; }|0:|4:end.| link(onsearch,9209952:doAdd,[]) link(text,11092326:Text,[]) link(filename,5179944:Value,[(356,223)(391,223)]) } Add(Memory,5179944,385,182) { Default=String(log1.txt) }
------------ Дoбавленo в 00.18:
Вот что бы я добавил точно, так это загрузку StrList-a прямо из стрима, а ведь такие функции есть и записи и чтения
Пожалуй, я сейчас попробую, лишним не будет
|