ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Thread error

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
SrJeff
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 8 de Janeiro de 2010
Mensagens: 289

MensagemEnviada: Qua Mai 22, 2013 7:08 pm    Assunto: Thread error Responder com Citação

boa noite companheiros.

Para resolver uns problemas de velocidade em minha aplicação resolvi colocar alguns códigos em uma thread, mas após isso começou a ocorrer um problema: 'espaço insuficiente para processar este comando', toda hora ocorre esse erro especificamente quando faço o uso desta procedure:

Código:

procedure Redimensionar(Imagen:TBitmap; Ancho, Alto: Integer);
var
  Bitmap: TBitmap;
  //····························································
  // Procedimiento de Antialiasing con Distancia=1
  procedure Antialiasing(bmp1, bmp2:TBitmap);
  var
    r1,g1,b1:Integer;
    Y, X, j:integer;
    SL1, SL2, SL3: PRGBTripleArray;
  begin

    // Tamaño del bitmap destino
    bmp2.Height := bmp1.Height;
    bmp2.Width := bmp1.Width;
    // SCANLINE
    SL1 := bmp1.ScanLine[0];
    SL2 := bmp1.ScanLine[1];
    SL3 := bmp1.ScanLine[2];
 
    // reorrido para todos los pixels
    for Y := 1 to (bmp1.Height - 2) do begin
      for X := 1 to (bmp1.Width - 2) do begin
        R1 := 0;  G1 := 0; B1 := 0;
        // los 9 pixels a tener en cuenta
        for j := -1 to 1 do begin
          // FIla anterior
          R1 := R1 + SL1[X+j].rgbtRed    + SL2[X+j].rgbtRed    + SL3[X+j].rgbtRed;
          G1 := G1 + SL1[X+j].rgbtGreen  + SL2[X+j].rgbtGreen  + SL3[X+j].rgbtGreen;
          B1 := B1 + SL1[X+j].rgbtBlue   + SL2[X+j].rgbtBlue   + SL3[X+j].rgbtBlue;
        end;
        // Nuevo color
        R1:=Round(R1 div 9);
        G1:=Round(G1 div 9);
        B1:=Round(B1 div 9);
        // Asignar el nuevo
        bmp2.Canvas.Pixels[X, Y] := RGB(R1,G1,B1);
      end;
      // Siguientes...
      SL1 := SL2;
      SL2 := SL3;
      SL3 := bmp1.ScanLine[Y+1];
    end;
  end;
  //···························································· 
begin
 
  Bitmap:= TBitmap.Create;
 
  // Aplicamos antialiasing
  Antialiasing(Imagen, Bitmap);
  Imagen.Assign(Bitmap);
 
  // reducir
  try
    Bitmap.Width:= Ancho;
    Bitmap.Height:= Alto;
    Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect, Imagen);
    Imagen.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;
// -------------------------------------------------------------------------


quando uso está procedure dentro da thread ocorre o erro, mas o interessante é que nem sempre o erro ocorre, tem momentos que funciona perfeito, mas na maioria das vezes da o erro mencionado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Qua Mai 22, 2013 7:54 pm    Assunto: Responder com Citação

converta o bitmap em jpg e depois faça a sincronização na thread com o componente image

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
SrJeff
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 8 de Janeiro de 2010
Mensagens: 289

MensagemEnviada: Qua Mai 22, 2013 11:51 pm    Assunto: Responder com Citação

Onde exatamente devo converter para jpg?

uso da seguinte forma:

Código:

Redimensionar(thumbnail,FormRemoteDesktop.Image.Width , FormRemoteDesktop.Image.Height);


assim eu redimensiono o thumbnail para o tamanho do componente image, mas é ai que dá erro.

o funcionamento é + ou - assim:

*Recebo a imagem no formato stream do cliente, passo para uma variavel jpeg e depois converto para bitmap, faço o redimensionamento e por fim mostro a imagem no componente image.


Segue o código para receber e converter a imagem:

Código:

var Jpg:TJpegImage;
      T : string;
   thumbnail : TBitmap;
  begin
Try
  tempo := 0;
  T:=Socket.ReceiveText;
     if not Receiving then
     begin
         if pos(#0,T) > 0 then
         StreamSize := strtoint(copy(T,1,pos(#0,T)-1))
         else exit;

         Stream := TMemoryStream.Create;
         Receiving:=True;
         delete(T,1,pos(#0,T));
         FormRemoteDesktop.ProgressBar1.MaxValue := StreamSize;
     end else
     begin
     try
     Stream.Write(T[1],length(T));
     FormRemoteDesktop.ProgressBar1.Progress := Stream.Size;
     if Stream.Size = StreamSize then
     begin
     Stream.Position:=0;
     jpg:=TJPEGImage.Create;
     jpg.LoadFromStream(Stream);
     FreeAndNil(Stream);
     thumbnail := TBitmap.Create;
     // --------------------------
     if FormRemoteDesktop.B_Full_Screen.Flat = true then begin
     thumbnail.PixelFormat := pf32bit;
     thumbnail.Assign(jpg);
     Redimensionar(thumbnail,FormRemoteDesktop.Image.Width , FormRemoteDesktop.Image.Height);
     jpg:=TJPEGImage.Create;
     jpg.Assign(thumbnail);
    FormRemoteDesktop.Image.Picture.Assign(thumbnail);
     end else
         begin
         //sleep(100);
         FormRemoteDesktop.Image.Picture.Assign(jpg);
         end;
     jpg.Free;
     Receiving:=False;
     t := '';
     thumbnail.Free;
     end;
     except
     FreeAndNil(Stream);
     FreeAndNil(thumbnail);
    FreeAndNil(jpg);
     end;
     // .............
     end;
 except
 end;

end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Qui Mai 23, 2013 10:49 pm    Assunto: Responder com Citação

Código:
FormRemoteDesktop.ProgressBar1.Progress := Stream.Size;


veja que voce esta usando um componente ProgressBar1 dentro da thread

a função da thread é executar um código demorado em segundo plano, entretanto voce deve sincronizar o componente ProgressBar1 para não causar erro

veja esse post

http://www.activedelphi.com.br/forum/viewtopic.php?p=243894

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
SrJeff
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 8 de Janeiro de 2010
Mensagens: 289

MensagemEnviada: Sex Mai 24, 2013 2:26 pm    Assunto: Responder com Citação

já coloquei em Synchronize e ainda está dando erro, exatamente na linha que falei.... tá dando dor de cabeça já.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Sáb Mai 25, 2013 10:11 pm    Assunto: Responder com Citação

experimente

Converter BMP para JPEG
Coloque na cláusula uses do seu Form a unit Jpeg

Código:
procedure BmpToJpg(FileName: string);
var
  Jpg: TJpegImage;
  Stm: TMemoryStream;
  Bmp: TBitmap;
begin
  if FileExists(FileName) then begin
    Bmp := TBitmap.Create;
    Bmp.LoadFromFile(FileName);
    Jpg := TJpegImage.Create;
    Jpg.Assign(Bmp);
    Jpg.Compress;
    Stm := TMemoryStream.Create;
    Jpg.SaveToStream(Stm);
    Stm.Position := 0;
    Stm.SaveToFile(ChangeFileExt(FileName, '.jpg'));
    Stm.Free;
   Jpg.Free;
   Bmp.Free;
  end;
end;


O uso deste procedimento pode ser assim:

Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
  // após a conversão será criado o arquivo Figura.jpg no mesmo diretório
  BmpToJpg('C:\Temp\Figura.bmp');
end;


abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB