Конференция "Сети" » Проблема с компонентами TidTCPServer и TidTCPClient [D7, WinXP]
 
  • maxistent © (01.12.09 13:42) [40]
    в общем, я сделал так:

    procedure TForm1.ss1Execute(AThread: TIdPeerThread);
    var
    buf:pointer;
    DataSize:integer;
    st:TStream;
    r0:TRect;
    p0:TPoint;
    begin
    AThread.Connection.ReadBuffer(p0,sizeof(p0));//"габариты" всей картинки
    AThread.Connection.ReadBuffer(r0,sizeof(r0));//позиция текущего фрагмента
    AThread.Connection.ReadBuffer(DataSize,sizeof(DataSize));//размер изображения (jpg)
    GetMem(buf,DataSize);
    AThread.Connection.ReadBuffer(buf^,DataSize);

    //тут я все это складываю в стрим...
    st:=TMemoryStream.Create;
    st.Write(p0,sizeof(p0));
    st.Write(r0,sizeof(r0));
    st.Write(buf^,DataSize);
    FreeMem(buf,DataSize);
    st.Position:=0;
    //потом читаю это все в память...
    DataSize:=st.Size;
    GetMem(buf,DataSize);
    st.Read(buf^,DataSize);
    st.Free;

    //и передаю дальше...
    try
     PostMessage(Form1.Handle, WM_DATA_TO_RENDER_AVAIL, WPARAM(buf), LPARAM(DataSize)); except
     FreeMem(ptrDataToRender);
     raise;
    end;
    end;

    procedure TForm1.WMMyMessage(var Message: TMessage);
    var
    ptrDataToRender: Pointer;
    dwSizeOfDataToRender: DWord;
    st:TStream;
    jpg:TJPEGImage;
    p:TPoint;
    r:TRect;
    begin
    ptrDataToRender := Pointer(Message.wParam);
    dwSizeOfDataToRender := DWord(Message.lParam);
    try
    st:=TMemoryStream.Create;
    st.Write(ptrDataToRender^,dwSizeOfDataToRender);
    st.Position:=0;
    st.Read(p,sizeof(p));
    st.Read(r,sizeof(r));
    jpg:=TJPEGImage.Create;
    jpg.LoadFromStream(st);
    st.Free;:=TJPEGImage.Create;
    jpg.LoadFromStream(st);
    st.Free;
    Image1.Picture.Bitmap.Canvas.Draw(r.Left,r.Top,jpg);
    jpg.Free;
    finally
     FreeMem(ptrDataToRender);
    end;
    end;
    Image1.Picture.Bitmap.Canvas.Draw(r.Left,r.Top,jpg);
    jpg.Free;
    finally
     FreeMem(ptrDataToRender);
    end;
    end;



    Теперь все безупречно работает. И память распределяется и расходуется вроде правильно. Большое спасибо вам всем! теперь буду внимательней "смотреть" на указатели.. =)
  • maxistent © (01.12.09 13:46) [41]
    p.s. в [40] последние 6 строк кода ошибочно вставлены...
  • CrytoGen (01.12.09 13:49) [42]
    не походу ты всё равно не внимательно к указателям относишься:
    try
    PostMessage(Form1.Handle, WM_DATA_TO_RENDER_AVAIL, WPARAM(buf), LPARAM(DataSize)); except
    FreeMem(ptrDataToRender);
    raise;
    end;


    где ты тут работал с ptrDataToRender?
  • maxistent © (01.12.09 14:35) [43]
    ну это я уже по памяти списывал из кода и "на лету" редактировал, чтоб вам было проще читать... там не "ptrDataToRender", а "buf"  =)
  • Slym © (02.12.09 11:33) [44]
 
Конференция "Сети" » Проблема с компонентами TidTCPServer и TidTCPClient [D7, WinXP]
Есть новые Нет новых   [134437   +30][b:0][p:0.002]