Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Фaйлы 
Потоки - SharedStream

SharedStream
Краткое описание
Компонент предназначен для работы с файлами проекций в память, как с файловыми потоками.
С помощью этого компонента можно читать и записывать файлы, практически неограниченной длины (2^63 байт). Кроме тго, с помощью этого компонента можно передавать данные между приложениями, не используя очереди событий системы и, соответственно, не требует наличия окна обработки очереди
Параметры
  • FileName - Имя файла по-умолчанию
  • CoreName - Имя файла проекции по-умолчанию
  • PageMem - Количество страниц кратной выделенной памяти под файл проекции по-умолчанию
  • Mode - Режим доступа к файлу: ReadWrite - чтение/запись (без возможности дозаписи) данных из файла, Write - запись (с возможностью дозаписи) данных в файл
  • Методы
  • doOpen - Открывает файл и создает для него файл проекции ARG(FileName, CoreName, Offset, Size, PageMem)
  • doRemapping - Пересоздает прекцию файла. Работает только в режиме ReadWrite ARG(Offset)
  • doClose - Закрывает файл проекции
  • doPosition - Устанавливает номер байта значением из потока, с которого начинается считывание/запись данных
  • События
  • onOpen - Событие происходит всякий раз при создании файла проекции, выдавая в поток его размер ARG(SizeMMF)
  • onRemapping - Событие происходит всякий раз при пересоздании файла проекции, выдавая в поток его новый размер ARG(ReMapSizeMMF)
  • Свойства
  • Stream - Содержит идентификатор данных файла проекции для работы с ними
  • Memory - Содержит указатель области памяти (на первый байт памяти файла проекции)
  • SizeMMF - Содержит тукущий размер файла проекции в байтах
  • PageMMF - Содержит количество страниц кратной выделенной памяти
  • CountFileBlock - Содержит приведенное количество блоков памяти к размеру открываемого файла
  • CurOffsetBlock - Содержит текущий блок смещения
  • Position - Содержит позицию текущего байта в памяти
  • FileSize - Содержит размер связанного файла в байтах
  • FileOffset - Содержит текущее смещение от начала файла в байтах
  • Granularity - Содержит кратный размер системного блока памяти
  • Данные
  • FileName - Имя файла
  • CoreName - Имя файла проекции
  • Offset - Смещение от начала файла в байтах
  • Size - Размер выделенной памяти для файла проекции в байтах в режиме Write. В режиме ReadWrite размер берется кратным системному
  • PageMem - Количество страниц выделенной памяти под файл проекции
  • Примеры
  • Пример 1 -- Просмотр файлов любой длины (больше 4Гбайт)
    
    Add(MainForm,11176470,609,413)
    {
    Left=20
    Top=105
    Width=527
    Height=368
    Caption="FileMapVewer"
    Position=1
    Point(onClose)
    }
    Add(Menu,9436858,210,322)
    {
    Menu=#4:Load|4:Next|8:Previous|5:Begin|3:End|
    Point(onSelectNum)
    link(onSelectNum,12401350:doEvent,[])
    }
    Add(IndexToChanel,12401350,259,329)
    {
    Count=5
    Data=Integer(0)
    link(onEvent1,1786215:doExecute,[])
    link(onEvent2,6449920:doOperation,[(300,342)(300,216)])
    link(onEvent3,1172799:doOperation,[(305,349)(305,244)])
    link(onEvent4,16402917:doWork2,[(315,356)(315,321)])
    link(onEvent5,3042786:doData,[(310,363)(310,293)])
    }
    Add(Hub,2606912,378,329)
    {
    OutCount=3
    link(onEvent1,16402917:doWork3,[(459,335)])
    link(onEvent2,12437222:doOpen,[])
    link(onEvent3,4206186:doWork1,[(403,349)])
    }
    Add(FormatStr,6713179,560,413)
    {
    DataCount=4
    Mask="%1 - %2 - %3 - %4"
    link(onFString,11176470:doCaption,[])
    link(Str1,10881460:Var2,[])
    link(Str2,15197747:Var2,[])
    link(Str4,12437222:Granularity,[(587,390)(517,390)])
    }
    Add(ODialog,1786215,329,329)
    {
    link(onExecute,2606912:doEvent1,[])
    }
    Add(HubEx,4206186,399,406)
    {
    link(onEvent,10015508:doEvent1,[])
    }
    Add(Hub,4964243,581,210)
    {
    link(onEvent1,12437222:doRemapping,[(605,216)(605,380)(465,380)(465,349)])
    link(onEvent2,4206186:doWork3,[(650,223)(650,510)(403,510)])
    }
    Add(Hub,10015508,413,406)
    {
    link(onEvent1,11127952:doData,[])
    link(onEvent2,4597674:doConvert,[(440,419)(440,482)])
    }
    Add(Memo,8054800,560,455)
    {
    Width=519
    Height=334
    Align=5
    Font=[Courier New,8,0,0,204]
    ScrollBars=3
    }
    Add(DoData,11127952,448,406)
    {
    link(onEventData,14388698:doCase,[])
    link(Data,12437222:SizeMMF,[(454,387)(496,387)])
    }
    Add(Case,14388698,497,406)
    {
    DataOnTrue=String(Достигнут конец файла)
    link(onNextCase,1493232:doWork1,[(550,412)])
    link(onTrue,1493232:doWork2,[])
    }
    Add(HubEx,1493232,546,413)
    {
    link(onEvent,6713179:doString,[])
    }
    Add(Memory,2399477,483,287)
    {
    Default=String()
    }
    Add(SharedStream,12437222,476,336)
    {
    PageMem=16
    Point(FileSize)
    Point(FileOffset)
    Point(Granularity)
    link(CoreName,2399477:Value,[])
    link(Offset,12053861:Value,[(496,325)(524,325)])
    }
    Add(Stream2Hex,4597674,476,476)
    {
    Mode=4
    link(onResult,8054800:doText,[])
    link(Data,12437222:Stream,[])
    }
    Add(HubEx,16402917,455,315)
    {
    Angle=3
    link(onEvent,12053861:doClear,[(459,223)])
    }
    Add(Memory,12053861,518,210)
    {
    Default=Integer(0)
    link(onData,4964243:doEvent1,[])
    }
    Add(HubEx,10265774,448,210)
    {
    link(onEvent,12053861:doValue,[])
    }
    Add(Math,6449920,357,210)
    {
    Op2=1048576
    Point(doClear)
    link(onResult,9509682:doWork2,[])
    link(Op1,2953199:Var1,[(363,194)])
    }
    Add(Math,1172799,399,238)
    {
    OpType=1
    Op2=1048576
    Point(doClear)
    link(onResult,9509682:doWork3,[(445,244)])
    link(Op1,2953199:Var2,[])
    }
    Add(GetDataEx,15197747,567,385)
    {
    Angle=3
    link(Data,12437222:FileOffset,[(510,390)])
    }
    Add(GetDataEx,2953199,399,189)
    {
    Angle=1
    link(Data,15197747:Var1,[(573,194)])
    }
    Add(DoData,3042786,399,287)
    {
    link(onEventData,10265774:doWork3,[(452,293)])
    link(Data,10881460:Var1,[(405,276)(566,276)])
    }
    Add(GetDataEx,10881460,560,392)
    {
    Angle=3
    link(Data,12437222:FileSize,[(503,397)])
    }
    Add(HubEx,9509682,441,210)
    {
    link(onEvent,10265774:doWork2,[])
    }
  • Пример 2 -- Чтение и редактирование файла в пределах длины загруженного блока
    
    Add(MainForm,11176470,455,140)
    {
    Left=20
    Top=105
    Width=527
    Caption="FileMapReadWrite"
    Point(onClose)
    }
    Add(Menu,9436858,154,196)
    {
    Menu=#4:Load|5:Write|
    Point(onSelectNum)
    link(onSelectNum,12401350:doEvent,[])
    }
    Add(IndexToChanel,12401350,203,203)
    {
    Data=Integer(0)
    link(onEvent1,1786215:doExecute,[(247,209)(247,146)])
    link(onEvent2,9182042:doEvent1,[])
    }
    Add(DoData,2298906,343,217)
    {
    link(onEventData,1143428:doPut,[])
    link(Data,11804486:Text,[(349,200)(420,200)(420,255)(461,255)])
    }
    Add(DataToFile,1143428,399,217)
    {
    Type=6
    Point(doPosition)
    Point(Position)
    link(onGet,11804486:doText,[])
    link(Stream,11748904:Stream,[])
    }
    Add(Hub,9182042,301,210)
    {
    link(onEvent1,696098:doWork2,[])
    link(onEvent2,2298906:doData,[])
    }
    Add(SharedStream,11748904,399,140)
    {
    CoreName="My_MapFile"
    PageMem=4
    link(onOpen,11176470:doCaption,[])
    }
    Add(Memo,11804486,455,196)
    {
    Width=574
    Height=387
    Align=5
    Font=[Courier New,10,1,0,204]
    ScrollBars=3
    }
    Add(ODialog,1786215,259,140)
    {
    link(onExecute,8165055:doEvent1,[])
    }
    Add(Hub,8165055,301,140)
    {
    OutCount=3
    link(onEvent1,11748904:doOpen,[])
    link(onEvent2,696098:doWork1,[(333,153)])
    link(onEvent3,1143428:doGet,[(384,160)(384,230)])
    }
    Add(HubEx,696098,329,210)
    {
    Angle=1
    link(onEvent,1143428:doPosition,[(333,237)])
    }
  • Пример 3 -- Передача текстовых данных между двумя приложениями. Для проверки, требует запуска двух копий
    
    Add(MainForm,11176470,434,203)
    {
    Left=20
    Top=105
    Width=527
    Caption="MemoryMapFile"
    Point(onClose)
    link(onCreate,11748904:doOpen,[])
    }
    Add(Menu,9436858,224,273)
    {
    Menu=#6:Append|5:Write|4:Read|
    Point(onSelectNum)
    link(onSelectNum,12401350:doEvent,[])
    }
    Add(IndexToChanel,12401350,273,280)
    {
    Count=3
    Data=Integer(0)
    link(onEvent1,2934282:doOperation,[])
    link(onEvent2,11567502:doWork3,[(368,293)])
    link(onEvent3,1104125:doEvent1,[(315,300)(315,328)])
    }
    Add(DoData,2298906,434,287)
    {
    link(onEventData,1143428:doPut,[])
    link(Data,11804486:Text,[(440,269)(510,269)(510,345)(552,345)])
    }
    Add(DataToFile,1143428,490,287)
    {
    Type=6
    Point(doPosition)
    Point(Position)
    link(onGet,11804486:doText,[])
    link(Stream,11748904:Stream,[])
    }
    Add(Hub,9182042,378,280)
    {
    link(onEvent1,2836025:doWork1,[(410,286)])
    link(onEvent2,2298906:doData,[])
    }
    Add(HubEx,2836025,406,301)
    {
    link(onEvent,1143428:doPosition,[])
    }
    Add(Hub,1104125,378,322)
    {
    link(onEvent1,2836025:doWork3,[(410,328)])
    link(onEvent2,1143428:doGet,[(474,335)(474,300)])
    }
    Add(Math,2934282,322,280)
    {
    OpType=1
    Op2=1
    link(onResult,11567502:doWork2,[])
    link(Op1,1143428:Position,[(328,269)(360,269)(360,345)(503,345)])
    }
    Add(SharedStream,11748904,490,217)
    {
    CoreName="My_MapFile"
    PageMem=4
    link(onOpen,11176470:doCaption,[(534,223)(534,196)(420,196)(420,209)])
    }
    Add(Memo,11804486,546,266)
    {
    Width=574
    Height=387
    Align=5
    Font=[Courier New,10,1,0,204]
    }
    Add(HubEx,11567502,364,280)
    {
    link(onEvent,9182042:doEvent1,[])
    }
  • Пример 4 -- Копирование файлов любой длины (больше 4Гбайт)
    
    Add(MainForm,11176470,511,399)
    {
    Left=20
    Top=105
    Width=370
    Height=116
    Caption="FileMapCopy"
    Position=1
    Point(onClose)
    }
    Add(Hub,2606912,231,301)
    {
    OutCount=5
    link(onEvent1,12053861:doClear,[(262,307)(262,237)])
    link(onEvent2,75271:doData,[])
    link(onEvent3,12437222:doOpen,[])
    link(onEvent4,2453142:doData,[(262,328)(262,447)])
    link(onEvent5,8948769:doWork1,[(256,335)])
    }
    Add(FormatStr,6713179,357,399)
    {
    DataCount=3
    Mask="%2 / %1 / %3"
    link(onFString,2689277:doWork2,[])
    link(Str1,6464666:Var2,[])
    link(Str2,12437222:FileSize,[])
    link(Str3,8406968:Var2,[])
    }
    Add(ODialog,1786215,147,301)
    {
    link(onExecute,9721491:doText,[])
    }
    Add(SharedStream,12437222,343,315)
    {
    CoreName="Reader"
    PageMem=160
    Point(FileSize)
    Point(CountFileBlock)
    Point(FileOffset)
    Point(CurOffsetBlock)
    link(Offset,16245746:Var2,[])
    }
    Add(Memory,12053861,357,224)
    {
    Default=Integer(0)
    }
    Add(Edit,9721491,189,301)
    {
    Left=5
    Top=10
    Width=325
    Color=15527129
    Text=""
    link(onChange,2606912:doEvent1,[])
    }
    Add(Button,15010227,105,301)
    {
    Left=335
    Top=10
    Width=20
    Font=[MS Sans Serif,8,1,0,1]
    Cursor=2
    TabOrder=-1
    Caption="..."
    Data=Integer(6)
    link(onClick,1786215:doExecute,[])
    }
    Add(Hub,7955653,280,189)
    {
    OutCount=5
    link(onEvent1,12053861:doValue,[(345,195)(345,230)])
    link(onEvent2,12437222:doRemapping,[(320,202)(320,328)])
    link(onEvent3,13857900:doWork2,[])
    link(onEvent4,8948769:doWork3,[(448,216)(448,455)(256,455)])
    link(onEvent5,16653913:doOperation,[(315,223)(315,475)])
    }
    Add(HubEx,8948769,252,399)
    {
    link(onEvent,6713179:doString,[])
    }
    Add(Edit,6608579,595,231)
    {
    Left=5
    Top=35
    Width=285
    Color=13099746
    Text=""
    ReadOnly=0
    link(onChange,3741764:doFileExists,[])
    }
    Add(SDialog,607125,553,231)
    {
    link(onExecute,6608579:doText,[])
    }
    Add(ProgressBar,999899,595,434)
    {
    Left=5
    Top=60
    Width=350
    Height=15
    Ctl3D=0
    WinStyle=2
    Smooth=1
    ProgressColor=7554575
    Point(doMax)
    }
    Add(SharedStream,4764602,595,315)
    {
    CoreName="Writer"
    PageMem=160
    Mode=1
    link(onOpen,3538368:doCopy,[(636,321)(636,286)(583,286)(583,398)])
    link(FileName,14638908:Var2,[])
    link(Offset,16245746:Var3,[(615,292)])
    link(Size,6464666:Var3,[(622,298)(482,298)(482,383)])
    }
    Add(Hub,9127255,84,98)
    {
    OutCount=3
    link(onEvent1,13857900:doWork1,[(501,104)])
    link(onEvent2,13074501:doStart,[])
    link(onEvent3,15201884:doFor,[(109,118)(109,195)])
    }
    Add(Application,2819314,595,476)
    {
    }
    Add(HubEx,13857900,497,203)
    {
    Angle=1
    link(onEvent,4764602:doOpen,[(501,321)])
    }
    Add(GetDataEx,6464666,357,378)
    {
    link(Data,12437222:SizeMMF,[])
    }
    Add(GetDataEx,16245746,357,287)
    {
    link(Data,12053861:Value,[])
    }
    Add(StreamCopy,3538368,595,392)
    {
    link(Dest,4764602:Stream,[])
    link(Source,12437222:Stream,[(608,376)(349,376)])
    }
    Add(For,15201884,119,189)
    {
    IncludeEnd=1
    link(onEvent,13481594:doCalc,[])
    link(onStop,2532482:doEvent1,[])
    link(End,12814098:GetData,[])
    }
    Add(TimeCounter,13074501,448,105)
    {
    link(onStop,2689277:doWork1,[(494,118)])
    }
    Add(HubEx,2689277,490,399)
    {
    link(onEvent,11176470:doCaption,[])
    }
    Add(EventFromData,12814098,126,140)
    {
    link(onEvent,573981:doOperation,[])
    }
    Add(Math,573981,175,140)
    {
    OpType=1
    Op2=1
    link(onResult,12814098:doData,[(218,146)(218,128)(114,128)(114,146)])
    link(Op1,5399951:Var1,[(181,97)(433,97)])
    }
    Add(MathParse,13481594,238,189)
    {
    link(onResult,7955653:doEvent1,[])
    link(X1,12437222:FileOffset,[(244,165)(405,165)(405,358)(384,358)])
    link(X2,6464666:Var1,[(251,170)(335,170)(335,383)])
    }
    Add(DoData,2453142,427,441)
    {
    link(onEventData,999899:doMax,[])
    link(Data,5399951:Var2,[])
    }
    Add(GetDataEx,8406968,371,364)
    {
    link(Data,12437222:CountFileBlock,[])
    }
    Add(FileTools,3741764,637,210)
    {
    link(onEnd,11825168:doEvent,[])
    }
    Add(IndexToChanel,11825168,679,210)
    {
    link(onEvent1,8297473:doWork3,[(725,216)])
    link(onEvent2,8911471:doDelete,[])
    }
    Add(FileTools,8911471,735,203)
    {
    link(onEnd,8297473:doWork2,[(777,209)(777,83)])
    link(FileName,14638908:Var3,[(741,191)(786,191)(786,278)])
    }
    Add(GetDataEx,14638908,595,273)
    {
    link(Data,6608579:Text,[])
    }
    Add(HubEx,8297473,721,77)
    {
    Angle=2
    link(onEvent,11001603:doTimer,[(23,83)(23,104)])
    }
    Add(Button,53629,511,231)
    {
    Left=300
    Top=35
    Font=[MS Sans Serif,8,1,0,1]
    TabOrder=-1
    Caption="Copy"
    link(onClick,607125:doExecute,[])
    }
    Add(Hub,885053,546,469)
    {
    link(onEvent1,14504423:doWork3,[(574,475)])
    link(onEvent2,2819314:doProcessMessages,[])
    }
    Add(Math,16653913,385,469)
    {
    Op2=1
    link(onResult,885053:doEvent1,[])
    link(Op1,12437222:CurOffsetBlock,[])
    }
    Add(Timer,11001603,35,98)
    {
    Interval=25
    Enable=1
    AutoStop=1
    link(onTimer,9127255:doEvent1,[])
    }
    Add(GetDataEx,5399951,427,364)
    {
    Angle=3
    link(Data,8406968:Var3,[])
    }
    Add(DoData,75271,266,308)
    {
    Data=Integer(0)
    link(onEventData,14504423:doWork2,[(310,314)(310,440)])
    }
    Add(HubEx,14504423,570,434)
    {
    link(onEvent,999899:doPosition,[])
    }
    Add(Hub,2532482,182,196)
    {
    OutCount=3
    link(onEvent1,13074501:doStop,[(225,202)(225,118)])
    link(onEvent2,4764602:doClose,[(226,209)(226,270)(573,270)(573,335)])
    link(onEvent3,12437222:doClose,[(219,216)(219,275)(325,275)(325,335)])
    }
  • Замечания
    Обновление элемента: [svn]SharedStream.pas[/svn]
    BB-code статьи для вставки
    Всего комментариев: 0
    (комментарии к статье еще не добавлены)
    Комментарий
    ...