Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#61: 2008-07-15 16:49:00 ЛС | профиль | цитата
Можно остановиться, можно и думать
Дело вкуса.

А вот когда Dilma говорил про "корректнее", он видимо имел ввиду что-то типа такого (это я типа расшифровать пытаюсь)

#sha
Add(MainForm,11176470,175,35)
{
Left=20
Top=105
Width=527
Point(onClose)
link(onCreate,2371655:doOpen,[])
link(onClose,2371655:doClose,[])
}
Add(RichEdit,2797906,343,105)
{
Left=10
Top=35
Width=495
Height=225
Align=5
FileName=".\compiler\Fpc\kol.pas"
ScrollBars=3
}
Add(InlineCode,2371655,287,49)
{
WorkPoints=#6:doOpen|7:doClose|
VarPoints=#6:Stream|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses windows,kol,Share,Debug;|0:|4:type|14: {$ifndef F_P}|33: TStreamEx = object(TStream) end;|24: PStreamEx = ^TStreamEx;|8: {$else}|32: TStreamEx = class(TStream) end;|23: PStreamEx = TStreamEx;|9: {$endif}|0:|28: THiAsmClass = class(TDebug)|10: private|18: hMMF:THandle;|16: Data:PChar;|18: ST:PSTreamEx;|21: procedure Close;|9: public|24: constructor Create;|33: destructor Destroy;override;|46: procedure doOpen(var _D:TData; idx:word);|47: procedure doClose(var _D:TData; idx:word);|46: procedure Stream(var _D:TData; idx:word);|5: end;|0:|14:implementation|0:|22:const Size = 10000000;|0:|79:function WriteExMemoryStream( Strm: PStream; var Buffer; Count: DWORD ): DWORD;|3:asm|20: PUSH EBX|25: XCHG EBX, EAX|49: MOV EAX, [EBX].TStreamEx.fData.fSize|53: SUB EAX, [EBX].TStreamEx.fData.fPosition|25: CMP EAX, ECX|20: JGE @@1|25: XCHG ECX, EAX|4:@@1:|45: MOV EAX, [EBX].TStreamEx.fMemory|53: ADD EAX, [EBX].TStreamEx.fData.fPosition|25: XCHG EDX, EAX|20: PUSH ECX|28: CALL System.Move|20: POP EAX|53: ADD [EBX].TStreamEx.fData.fPosition, EAX|20: POP EBX|4:end;|0:|37:var SharedMethods: TStreamMethods = (|25: fSeek: SeekMemStream;|30: fGetSiz: GetSizeMemStream;|26: fSetSiz: DummySetSize;|25: fRead: ReadMemStream;|32: fWrite: WriteExMemoryStream;|28: fClose: DummyStreamProc;|17: fCustom: nil;|15: fWait: nil;|4: );|0:|31:constructor THiAsmClass.Create;|5:begin|100: hMMF := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, Size, 'MySuperPuperName');|4:end;|0:|29:procedure THiAsmClass.doOpen;|14:var P:Pointer;|5:begin|22: if hMMF=0 then exit;|8: Close;|55: P := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, Size);|21: if P=nil then exit;|45: ST := PStreamEx(_NewStream(SharedMethods));|18: ST.fMemory := P;|29: ST.fData.fCapacity := Size;|25: ST.fData.fSize := Size;|4:end;|0:|28:procedure THiAsmClass.Close;|5:begin|22: if ST=nil then exit;|30: UnmapViewOfFile(ST.fMemory);|19: free_and_nil(ST);|4:end;|0:|30:procedure THiAsmClass.doClose;|5:begin|8: Close;|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|8: Close;|20: CloseHandle(hMMF);|4:end;|0:|29:procedure THiAsmClass.Stream;|5:begin|18: dtStream(_D,ST);|4:end;|0:|4:end.|
}
Add(Menu,9436858,28,105)
{
Menu=#6:Append|5:Write|4:Read|
Point(onSelectNum)
link(onSelectNum,12401350:doEvent,[])
}
Add(IndexToChanel,12401350,77,112)
{
Count=3
Data=Integer(0)
link(onEvent1,2934282:doOperation,[])
link(onEvent2,9182042:doEvent2,[])
link(onEvent3,1104125:doEvent1,[(118,132)(118,160)])
}
Add(DoData,2298906,231,119)
{
link(onEventData,1143428:doPut,[])
link(Data,2797906:Text,[(237,108)(333,108)(333,155)(349,155)])
}
Add(DataToFile,1143428,287,119)
{
Type=6
Point(doPosition)
Point(Position)
link(onGet,2797906:doText,[])
link(Stream,2371655:Stream,[])
}
Add(Hub,9182042,175,112)
{
InCount=2
link(onEvent1,2836025:doWork1,[(221,118)])
link(onEvent2,2298906:doData,[])
}
Add(HubEx,2836025,217,126)
{
link(onEvent,1143428:doPosition,[])
}
Add(Hub,1104125,175,154)
{
link(onEvent1,2836025:doWork3,[(221,160)])
link(onEvent2,1143428:doGet,[(271,167)(271,132)])
}
Add(Math,2934282,126,112)
{
OpType=1
Op2=1
link(onResult,9182042:doEvent1,[])
link(Op1,1143428:Position,[(132,101)(149,101)(149,176)(300,176)])
}
Все одно -- ASM версия для WriteExMemoryStream в KOL кривоватая слегка...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#62: 2008-07-15 17:00:33 ЛС | профиль | цитата
Ха, а первый Append выдает Exception.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#63: 2008-07-15 17:21:51 ЛС | профиль | цитата
Так поставь защиту на отрицательные значения в методах doPosition всех элементов.
А не "Ха"

+к этому можно переопределить SeekMemStream в SharedMethods так, чтобы вместо SetSize(NewPos) ограничивалось NewPos

карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#64: 2008-07-15 17:26:31 ЛС | профиль | цитата
Galkov писал(а):
Так поставь защиту на отрицательные значения в методах doPosition всех элементов

Это предложение поправить все компоненты стримов на предмет блокирования отрицательных doPosition
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#65: 2008-07-15 18:24:19 ЛС | профиль | цитата
Galkov писал(а):
Так поставь защиту на отрицательные значения в методах doPosition всех элементов.

не согласен с таким подходом. Во всяком случае до тех пор, пока мы не определимся какой пакет делаем - максимально надежный или повозможности быстрый. Конечно к стандартному пакету это относится мало, но все же не стоит приучать пользователя к лени. А своими проверками вы это как раз и делаете. Начинающему хорошо - за него все случае предусмотрены, а опытному беда - обойти эти проверки он не может, хотя знает, что в данной конкретной схеме они глупы и бессмыслены...

Уж если есть такое желание предупредить все глупости пользователя, которые он может сделать то хотя бы стоит ввести дефайн, без которого весь этот мусор не будет попадать в проект. Например:

#pas
str := ReadString(_Data,_data_Str,');
{$IFDEF _lamer_mode_}
if str <> ' then begin
{$ENDIF}
Pos := ReadInteger(_Data, _data_Position, _prop_Position);
Count := ReadInteger(_Data, _data_Count, _prop_Count);
if _prop_Direction = 1 then Pos := Length(str) - Count - Pos + 2;
{$IFDEF _lamer_mode_}
if Pos <= 0 then begin
Inc(Count, Pos-1);
Pos := 1;
end;
{$ENDIF}
_hi_CreateEvent(_Data, @_event_onCopy, Copy(str,Pos,Count));
{$IFDEF _lamer_mode_}
end;
{$ENDIF}
карма: 27
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#66: 2008-07-15 18:52:04 ЛС | профиль | цитата
Может лучше, обратный дефайн, что бы при отсутствии команды компиляции автоматически включался защищенный режим, а, например, _quick_mode, отключал бы проверки
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#67: 2008-07-16 01:13:17 ЛС | профиль | цитата
nesco, не вижу смысла в инверсной логике. В предложеном варианте для обеспечения совместимости очевидно, что _lamer_mode_ является объявленным по умолчанию.
карма: 27
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#68: 2008-07-28 16:45:30 ЛС | профиль | цитата
Dilma писал(а):
очевидно, что _lamer_mode_ является объявленным по умолчанию

Теперь понял -- директива define _lamer_mode_

------------ Дoбавленo:

Экспериментальное продолжение -- ver 1.10
карма: 22

0
файлы: 1project_sharedstream_1_10.zip [3.9KB] [300]
Разработчик
Ответов: 26151
Рейтинг: 2127
#69: 2009-10-22 17:15:40 ЛС | профиль | цитата
На SVN доступен компонент SharedStream в последней редакции. Для тестирования и использования настоятельно рекомендуется посетить Wiki, внимательно прочитать и посмотреть в работе четыре примера
карма: 22

1
Голосовали:Konst
Разработчик
Ответов: 4698
Рейтинг: 426
#70: 2009-10-22 19:28:38 ЛС | профиль | цитата
Так, а теперь объясните пожалуйста, чем он отличается и лучше обычного FileStream, тему прочитал, так и не допер, по вики понял одно: с ним можно читать файлы размером 4ГБ и выше, а остальное преимущество(или недостаток) в чем
карма: 10
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#71: 2009-10-22 20:33:39 ЛС | профиль | цитата
Assasin писал(а):
чем он отличается и лучше обычного FileStream

Первое: Принцип, заложенный в этот компонент (проекция файлов) является исходным для всех файловых операций (низкоуровневый доступ), предоставляя прямой доступ к памяти копии файла, откуда, огромная скорость копирования.
Второе: Очень быстрый доступ к любому блоку файла, независимо от длины и местоположения
Третье: Доступ к файлам огромной длины, в идеале -- до 19 экзабайт длиной
Четвертое: Возможно использовать страницу памяти, как псевдо-файл со своим именем. Если запустить разные приложения, у которых есть доступ к таким одноименным проекциям, то можно обмениваться данными между приложениями посредством простых стримов. Проеккция такого псевдо-файла будет жива до тех пор, пока все приложения, ее использующие, не освободят ее от использования.

Это я перечислил достоинства. К недостаткам можно отнести только одно -- сложность понимания происходящих действий. Но можно сказать одно, этот метод в разы выше по скрости, чем FileStream.
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#72: 2009-10-22 20:38:32 ЛС | профиль | цитата
Угу, ого, ой-ой-ой, ай-ай-ай!!! Вот мои комментарии
А если подробнее:
Угу - понятно
ого - крутые возможности!!!
ай-ай-ай - сложность происходящего
ой-ой-ой - 19 экзабайт - поясните пожалуйста это сколько Петабайтов
карма: 10
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#73: 2009-10-22 21:26:51 ЛС | профиль | цитата
Assasin,

Ты это чего, того, что ли, с катушек съехал

И че я такого сказал
------------ Дoбавленo в 21.32:
Assasin писал(а):
19 экзабайт - поясните пожалуйста это сколько Петабайтов

1 эксабайт (я в букве ошибся, не "з", а "с")= 1024 петабайт
карма: 22

0
Ответов: 4641
Рейтинг: 334
#74: 2009-10-22 21:44:53 ЛС | профиль | цитата
19 миллионов терабайт
Хороший размер = хороший компонент
------------ Дoбавленo в 21.50:
--------------
сын спрашивает у отца программиста
-А сколько граммов в килограмме?
- 1024 грамм! Отвечает отец.
-----------------


карма: 1
Время верстки: %cr_time% Текущее время: %time%
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#75: 2009-10-22 21:58:55 ЛС | профиль | цитата
Мдааа... Уж. Копирование файлов быстро и большой длины, это, кончено, очень важный аргумент, но не самый важный. Ценность проекций именно в том, что они не тебуют оконного обработчика и позволяют связывать между собой любые процессы, от драйверов до простых приложений, и объем передаваемых данных будет зависить только от размера свободной памяти компа
карма: 22

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