Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#46: 2008-07-14 23:02:32 ЛС | профиль | цитата
Galkov писал(а):
нам понять трудно, оказывается

Ну и загадочно же ты пишешь, лучше бы разъяснил подробнее, или дал ссылку где почитать
карма: 22

0
Ответов: 9906
Рейтинг: 351
#47: 2008-07-14 23:05:32 ЛС | профиль | цитата
Почитать - Kol.pas, естественно
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#48: 2008-07-14 23:11:48 ЛС | профиль | цитата
чего там разьяснять? наследуемся от TStream, перекрываем все методы, и клепаем конструктор: NewMemoryStream(name) - причем если name еще не существует, то создается новый блок. Создавать, убивать, читать и писать вроде научились уже...
------------ Дoбавленo:

если точнее, то всего лишь нужно прописать свою структурку TStreamMethods и все делов-то. Больше времени на форуме обсуждали это все...
карма: 27
0
Ответов: 9906
Рейтинг: 351
#49: 2008-07-15 09:48:05 ЛС | профиль | цитата
Возрадуйся, nesco, можно не достигать "лучшего понимания происходящего"

Оказывается Кладов предусмотрел и такой вариант

Kol.pas писал(а):
function NewExMemoryStream( ExistingMem: Pointer; Size: DWORD ): PStream;
{* Creates memory stream on base of existing memory. It is not possible
to write out of top bound given by Size (i.e. memory can not be resized,
or reallocated. When stream object is destroyed this memory is not freed. }

карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#50: 2008-07-15 10:31:25 ЛС | профиль | цитата
Galkov, ну и как с этим зверем работать
У него за памятью еще и следить надо, и чем оно лучше FileMap'a
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#51: 2008-07-15 10:37:25 ЛС | профиль | цитата
глядя на одни только параметры можно одназначно понять, как с этим работать... Хотя я все же считаю корректнее определить свои поля в TStreamMethods и сделать свой комнструктор, передающий эту структуру наружу, поскольку NewExMemoryStream это урезаный способ для самых ленивых.
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#52: 2008-07-15 10:39:44 ЛС | профиль | цитата
А не проще ли свой конструктор написать, чисто на своих методах
карма: 22

0
Ответов: 9906
Рейтинг: 351
#53: 2008-07-15 12:10:49 ЛС | профиль | цитата
Dilma писал(а):
Хотя я все же считаю корректнее определить свои поля в TStreamMethods и сделать свой конструктор, передающий эту структуру наружу, поскольку NewExMemoryStream это урезанный способ для самых ленивых.


  • Вообще-то заготовка уже есть, называется: _NewStream( const StreamMethods: TStreamMethods ): PStream
  • В принципе, ДА, Кладов наступил на горло собственной песне, и пристегнул лишние в данном случае SetSizeMemStream, WriteMemStream и CloseMemStream В смысле, не создавал свою структуру под конструктор, а "переделывал" MemoryMethods
    А вот только заменитель (WriteExMemoryStream) находится только в implementation.
    +доступ к protected-полям.

  • А вот в чем состоит урезанность, мне -- не понятно. Есть кусок памяти, полученный из OpenFileMapping и этим куском делать ничего нельзя.
    Приспичит если вдруг сделать новый маппинг - ну так под новый маппинг, и новый стрим....

  • карма: 9

    0
    Разработчик
    Ответов: 26163
    Рейтинг: 2127
    #54: 2008-07-15 12:19:27 ЛС | профиль | цитата
    А читать то как из созданного по NewExMemoryStream стрима, он же доступен только на запись. Вот где здесь пристегнут метод для чтения, ну не пойму я

    
    function NewExMemoryStream( ExistingMem: Pointer; Size: DWORD ): PStream;
    begin
    Result := NewMemoryStream;
    Result.fMemory := ExistingMem;
    Result.fData.fCapacity := Size;
    Result.fData.fSize := Size;
    Result.fMethods.fWrite := WriteExMemoryStream;
    Result.fMethods.fSetSiz := DummySetSize;
    Result.fMethods.fClose := DummyClose_ExMemStream;
    end;
    карма: 22

    0
    Ответов: 9906
    Рейтинг: 351
    #55: 2008-07-15 12:30:23 ЛС | профиль | цитата
    А ты попробуй прочитать, глядишь и получится
    карма: 9

    0
    Разработчик
    Ответов: 26163
    Рейтинг: 2127
    #56: 2008-07-15 13:34:34 ЛС | профиль | цитата
    Попробовал, нифига не получилось, глянь, что я не так сделал

    
    Add(MainForm,11176470,273,287)
    {
    Left=20
    Top=105
    Width=527
    link(onCreate,2797906:doLoad,[])
    }
    Add(RichEdit,2797906,392,280)
    {
    Left=10
    Top=35
    Width=495
    Height=225
    Align=5
    FileName=".\compiler\Fpc\kol.pas"
    ScrollBars=3
    }
    Add(InlineCode,2371655,448,343)
    {
    WorkPoints=#7:doWrite|6:doRead|
    EventPoints=#6:onRead|
    Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|18: hMMF:THandle;|16: Data:PChar;|20:// Data:Pointer;|18: Strm:PStream;|9: public|22: onRead:THI_Event;|24: constructor Create;|33: destructor Destroy;override;|47: procedure doWrite(var _D:TData; idx:word);|46: procedure doRead(var _D:TData; idx:word);|5: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|14: Data := nil;|12: hMMF := 0;|104: hMMF := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, 10000000, 'MySuperPuperName');|62: Data := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 10000000);|63: if Data <> nil then Strm := NewExMemoryStream(Data,10000000);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnmapViewOfFile(Data);|20: CloseHandle(hMMF);|12: Strm.free;|4:end;|0:|30:procedure THiAsmClass.doWrite;|24:var s:string; i:integer;|5:begin|21: s := ToString(_D); |17: i := length(s);|34: if not Assigned(Strm) then exit;|18: Strm.Write(i,4);|23: Strm.Write(s[1],i); |4:end;|0:|29:procedure THiAsmClass.doRead;|24:var s:string; i:integer;|5:begin|34: if not Assigned(Strm) then exit;|17: Strm.Read(i,4);|17: SetLength(s,i);|20: Strm.Read(s[1],i);|32: _hi_CreateEvent(_D,@onRead,s);|4:end;|0:|0:|0:|4:end.|
    link(onRead,2797906:doText,[(492,349)(492,328)(380,328)(380,300)])
    }
    Add(Menu,9436858,273,336)
    {
    Menu=#5:Write|4:Read|
    Point(onSelectNum)
    link(onSelectNum,12401350:doEvent,[])
    }
    Add(IndexToChanel,12401350,336,343)
    {
    link(onEvent1,2298906:doData,[])
    link(onEvent2,2371655:doRead,[])
    }
    Add(DoData,2298906,392,343)
    {
    link(onEventData,2371655:doWrite,[])
    link(Data,2797906:Text,[])
    }

    карма: 22

    0
    Ответов: 9906
    Рейтинг: 351
    #57: 2008-07-15 14:12:25 ЛС | профиль | цитата
    Глянул
    Делаю вывод: СТЫД и ПОЗОР
    И вот только не надо обижаться, что типа тебя как мальчика....
    Хочешь быть взрослым - ТАК БУДЬ ИМ

    Позицию в стриме кто за тебя устанавливать будет, интересно - как ребенок, честное слово
    карма: 9

    0
    Разработчик
    Ответов: 26163
    Рейтинг: 2127
    #58: 2008-07-15 15:18:12 ЛС | профиль | цитата
    Galkov писал(а):
    СТЫД и ПОЗОР


    Galkov писал(а):
    Позицию в стриме кто за тебя устанавливать будет

    Да, точно, каюсь, забыл про этот момент

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


    Поставил, заработало.

    Вот, что получилось, ну что-то не совсем быстро работает, может сказывается глюченый комп, черт его знает

    
    Add(MainForm,11176470,273,287)
    {
    Left=20
    Top=105
    Width=527
    link(onCreate,2797906:doLoad,[])
    }
    Add(RichEdit,2797906,392,280)
    {
    Left=10
    Top=35
    Width=495
    Height=225
    Align=5
    FileName=".\compiler\Fpc\kol.pas"
    ScrollBars=3
    }
    Add(InlineCode,2371655,448,343)
    {
    WorkPoints=#7:doWrite|6:doRead|
    EventPoints=#6:onRead|
    Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|18: hMMF:THandle;|18: Data:Pointer;|18: Strm:PStream;|9: public|22: onRead:THI_Event;|24: constructor Create;|33: destructor Destroy;override;|47: procedure doWrite(var _D:TData; idx:word);|46: procedure doRead(var _D:TData; idx:word);|5: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|14: Data := nil;|12: hMMF := 0;|104: hMMF := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, 10000000, 'MySuperPuperName');|62: Data := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 10000000);|63: if Data <> nil then Strm := NewExMemoryStream(Data,10000000);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnmapViewOfFile(Data);|20: CloseHandle(hMMF);|12: Strm.free;|4:end;|0:|30:procedure THiAsmClass.doWrite;|24:var s:string; i:integer;|5:begin|21: s := ToString(_D); |17: i := length(s);|34: if not Assigned(Strm) then exit;|21: Strm.Position := 0;|18: Strm.Write(i,4);|23: Strm.Write(s[1],i); |4:end;|0:|29:procedure THiAsmClass.doRead;|24:var s:string; i:integer;|5:begin|34: if not Assigned(Strm) then exit;|21: Strm.Position := 0;|17: Strm.Read(i,4);|17: SetLength(s,i);|20: Strm.Read(s[1],i);|10:_debug(i);|32: _hi_CreateEvent(_D,@onRead,s);|4:end;|0:|0:|0:|4:end.|
    link(onRead,2797906:doText,[(492,349)(492,328)(380,328)(380,300)])
    }
    Add(Menu,9436858,273,336)
    {
    Menu=#5:Write|4:Read|
    Point(onSelectNum)
    link(onSelectNum,12401350:doEvent,[])
    }
    Add(IndexToChanel,12401350,336,343)
    {
    link(onEvent1,2298906:doData,[])
    link(onEvent2,2371655:doRead,[])
    }
    Add(DoData,2298906,392,343)
    {
    link(onEventData,2371655:doWrite,[])
    link(Data,2797906:Text,[])
    }


    Какие будут выводы

    карма: 22

    0
    Ответов: 9906
    Рейтинг: 351
    #59: 2008-07-15 16:04:13 ЛС | профиль | цитата
    nesco писал(а):
    Какие будут выводы

    Выводы такие: две строки Strm.Position := 0; - ты поставил правильно
    карма: 9

    0
    Разработчик
    Ответов: 26163
    Рейтинг: 2127
    #60: 2008-07-15 16:23:35 ЛС | профиль | цитата
    А дальнейшая концепция как, остановимся на NewExMemoryStream, или что-то будем думать дальше
    карма: 22

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