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 

Montar uma thread arquivo json?
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Mai 12, 2017 9:08 am    Assunto: Montar uma thread arquivo json? Responder com Citação

Tem como montar um thread deste método aqui? O retorno do post dele esta muito lento 15 a 17 segundos de um arquivo o que trava o sistema por este período, por isso talvez uma thread resolva meu problema.

O método

Código:
procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
  I: Integer;
  Controller: TSincronismoController;
  ObjetoJson: TJSONObject;
  ParametroJson, StringJSON: TStringList;
  Resp: TStringStream;
  Resposta: String;
  Url: String;
  IdHTTP: TIdHTTP;
  DirJSON: String;
  ArquivoJson: TIdMultipartFormDataStream;
  VendaController: TVendaController;
  TTheadEnvio: TEnvioThread;
begin
  try
    IdHTTP := TIdHTTP.Create(nil);
    ParametroJson := TStringList.Create;
    StringJSON := TStringList.Create;
    try
      Controller := TSincronismoController.Create;
      Controller.oVendaAtual := Venda;
      Resp := TStringStream.Create('');
      with IdHTTP do
      begin
        IOHandler := IdSSLIOHandlerSocketOpenSSL1;
        ReadTimeout := 0;
        AllowCookies := True;
        ProxyParams.BasicAuthentication := True;
        ProxyParams.ProxyPort := 0;
        Request.CustomHeaders.Clear;
        Request.Clear;
        Request.ContentLength := -1;
        Request.ContentRangeEnd := 0;
        Request.ContentRangeStart := 0;
        Request.ContentEncoding := 'multipart/form-data';
        Request.CharSet := 'utf-8';
        // Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
        IdHTTP.Request.UserAgent :=
          'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
        // Adriano
        Request.ContentType := 'application/json';
      end;
      try
        Application.ProcessMessages;
        TrimAppMemorySize;
        ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
          IfThen(Venda <> nil, Venda.Id, 0));
        DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
          TB_VENDA + '.txt';
        try
          DeleteFile(DirJSON);
          StringJSON.Clear;
          StringJSON.Add(ObjetoJson.ToString);
          StringJSON.SaveToFile(DirJSON);
          Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
          ArquivoJson := TIdMultipartFormDataStream.Create;
          ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
          IdHTTP.Request.Referer := Url;
          try
            IdHTTP.Post(Url, ArquivoJson, Resp);
          except
            on E: Exception do
              ShowMessage('Error on request: '#13#10 + E.Message);
          end;

          DeleteFile(DirJSON);
        except
          // Exceção silenciosa
        end;
        // ShowMessage(Resp.DataString);
        // Resp.LoadFromFile('C:\respostaJson.txt');
        Resp.SaveToFile('C:\respostaJson.txt');
        TrataJsonRetorno(Resp);
        Resp.Clear;
        IdHTTP.Disconnect;
      finally
        try
          FreeAndNil(ObjetoJson);
          if Venda <> nil then
          begin
            Venda.Sincronizado := True;
            try
              VendaController := TVendaController.Create;
              VendaController.SetIdWeb(Venda);
            finally
              FreeAndNil(VendaController);
            end;
          end;
        except
          on E: Exception do
          begin
            // ShowMessage(e.Message);
            if ObjetoJson <> nil then
              ObjetoJson.Free;
          end;
        end;
      end;
    finally
      FreeAndNil(Controller);
      FreeAndNil(Resp);
      FreeAndNil(ParametroJson);
      FreeAndNil(StringJSON);
      FreeAndNil(IdHTTP);
      FreeAndNil(ArquivoJson);
    end;
  except
    on E: Exception do
      // ShowMessage(e.Message);
  end;

end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Mai 12, 2017 2:44 pm    Assunto: Responder com Citação

Tentou utilizar o componente idAntFreeze?
Ele serve justamente para isto, para não congelar a aplicação.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 9:47 am    Assunto: Responder com Citação

johnny-walker escreveu:
Tentou utilizar o componente idAntFreeze?
Ele serve justamente para isto, para não congelar a aplicação.


bye
Bom dia, o antfreezer não serve para o que estou querendo, quero que o sistema fique livre para ser usado novamente e o processo de sincronismo seja executado por trás.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 15, 2017 11:34 am    Assunto: Responder com Citação

Uma thread anonima cairia bem em seu caso e não precisaria de muita coisa.
qual versão do delphi estar a usar?
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 11:41 am    Assunto: Responder com Citação

strak2012 escreveu:
Uma thread anonima cairia bem em seu caso e não precisaria de muita coisa.
qual versão do delphi estar a usar?
Bom dia, estou usando o XE7.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 15, 2017 11:43 am    Assunto: Responder com Citação

Ficaria algo como isso cá:
Código:
procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
 myThread : TThread;
begin
  myThread := TThread.CreateAnonymousThread(
  procedure
var
  I: Integer;
  Controller: TSincronismoController;
  ObjetoJson: TJSONObject;
  ParametroJson, StringJSON: TStringList;
  Resp: TStringStream;
  Resposta: String;
  Url: String;
  IdHTTP: TIdHTTP;
  DirJSON: String;
  ArquivoJson: TIdMultipartFormDataStream;
  VendaController: TVendaController;
  TTheadEnvio: TEnvioThread;
begin
  try
    IdHTTP := TIdHTTP.Create(nil);
    ParametroJson := TStringList.Create;
    StringJSON := TStringList.Create;
    try
      Controller := TSincronismoController.Create;
      Controller.oVendaAtual := Venda;
      Resp := TStringStream.Create('');
      with IdHTTP do
      begin
        IOHandler := IdSSLIOHandlerSocketOpenSSL1;
        ReadTimeout := 0;
        AllowCookies := True;
        ProxyParams.BasicAuthentication := True;
        ProxyParams.ProxyPort := 0;
        Request.CustomHeaders.Clear;
        Request.Clear;
        Request.ContentLength := -1;
        Request.ContentRangeEnd := 0;
        Request.ContentRangeStart := 0;
        Request.ContentEncoding := 'multipart/form-data';
        Request.CharSet := 'utf-8';
        // Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
        IdHTTP.Request.UserAgent :=
          'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
        // Adriano
        Request.ContentType := 'application/json';
      end;
      try
        Application.ProcessMessages;
        TrimAppMemorySize;
        ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
          IfThen(Venda <> nil, Venda.Id, 0));
        DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
          TB_VENDA + '.txt';
        try
          DeleteFile(DirJSON);
          StringJSON.Clear;
          StringJSON.Add(ObjetoJson.ToString);
          StringJSON.SaveToFile(DirJSON);
          Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
          ArquivoJson := TIdMultipartFormDataStream.Create;
          ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
          IdHTTP.Request.Referer := Url;
          try
            IdHTTP.Post(Url, ArquivoJson, Resp);
          except
            on E: Exception do
              ShowMessage('Error on request: '#13#10 + E.Message);
          end;

          DeleteFile(DirJSON);
        except
          // Exceção silenciosa
        end;
        // ShowMessage(Resp.DataString);
        // Resp.LoadFromFile('C:\respostaJson.txt');
        Resp.SaveToFile('C:\respostaJson.txt');
        TrataJsonRetorno(Resp);
        Resp.Clear;
        IdHTTP.Disconnect;
      finally
        try
          FreeAndNil(ObjetoJson);
          if Venda <> nil then
          begin
            Venda.Sincronizado := True;
            try
              VendaController := TVendaController.Create;
              VendaController.SetIdWeb(Venda);
            finally
              FreeAndNil(VendaController);
            end;
          end;
        except
          on E: Exception do
          begin
            // ShowMessage(e.Message);
            if ObjetoJson <> nil then
              ObjetoJson.Free;
          end;
        end;
      end;
    finally
      FreeAndNil(Controller);
      FreeAndNil(Resp);
      FreeAndNil(ParametroJson);
      FreeAndNil(StringJSON);
      FreeAndNil(IdHTTP);
      FreeAndNil(ArquivoJson);
    end;
  except
    on E: Exception do
      // ShowMessage(e.Message);
  end;
  end);
  myThread.FreeOnTerminate:=true;
  myThread.start;
end;

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 11:43 am    Assunto: Responder com Citação

Cheguei a tentar fazer, mais assim não rolou, da erro de access violation

Código:
{ TEnvioThread }

procedure TEnvioThread.Execute;
var
  I: Integer;
  Controller: TSincronismoController;
  ObjetoJson: TJSONObject;
  ParametroJson, StringJSON: TStringList;
  Resp: TStringStream;
  Resposta: String;
  Url: String;
  IdHTTP: TIdHTTP;
  DirJSON: String;
  ArquivoJson: TIdMultipartFormDataStream;
  VendaController: TVendaController;
  TTheadEnvio: TEnvioThread;
  Venda: TVenda;
begin
  Priority := tpNormal;
  with frmSincronismo do
  begin
    try
      IdHTTP := TIdHTTP.Create(nil);
      ParametroJson := TStringList.Create;
      StringJSON := TStringList.Create;
      try
        Controller := TSincronismoController.Create;
        Controller.oVendaAtual := Venda;
        Resp := TStringStream.Create('');
        with IdHTTP do
        begin
          // IOHandler := IdSSLIOHandlerSocketOpenSSL1;
          ReadTimeout := 0;
          AllowCookies := True;
          ProxyParams.BasicAuthentication := True;
          ProxyParams.ProxyPort := 0;
          Request.CustomHeaders.Clear;
          Request.Clear;
          Request.ContentLength := -1;
          Request.ContentRangeEnd := 0;
          Request.ContentRangeStart := 0;
          Request.ContentEncoding := 'multipart/form-data';
          Request.CharSet := 'utf-8';
          Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
          Request.ContentType := 'application/json';
        end;
        try
          Application.ProcessMessages;
          TrimAppMemorySize;
          ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
            IfThen(Venda <> nil, Venda.Id, 0));
          DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
            TB_VENDA + '.txt';
          try
            DeleteFile(DirJSON);
            StringJSON.Clear;
            StringJSON.Add(ObjetoJson.ToString);
            StringJSON.SaveToFile(DirJSON);
            Url := 'https://minhaurl/sync/venda';
            ArquivoJson := TIdMultipartFormDataStream.Create;
            ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
            IdHTTP.Request.Referer := Url;

            try
              IdHTTP.Post(Url, ArquivoJson, Resp);
            except
              on E: Exception do
                ShowMessage('Error on request: '#13#10 + E.Message);
            end;

            DeleteFile(DirJSON);
          except
            // Exceção silenciosa
          end;
          // ShowMessage(Resp.DataString);
          // Resp.LoadFromFile('C:\respostaJson.txt');
          Resp.SaveToFile('C:\respostaJson.txt');
          TrataJsonRetorno(Resp);
          Resp.Clear;
          IdHTTP.Disconnect;
        finally
          try
            FreeAndNil(ObjetoJson);
            if Venda <> nil then
            begin
              Venda.Sincronizado := True;
              try
                VendaController := TVendaController.Create;
                VendaController.SetIdWeb(Venda);
              finally
                FreeAndNil(VendaController);
              end;
            end;
          except
            on E: Exception do
            begin
              // ShowMessage(e.Message);
              if ObjetoJson <> nil then
                ObjetoJson.Free;
            end;
          end;
        end;
      finally
        FreeAndNil(Controller);
        FreeAndNil(Resp);
        FreeAndNil(ParametroJson);
        FreeAndNil(StringJSON);
        FreeAndNil(IdHTTP);
        FreeAndNil(ArquivoJson);
      end;
    except
      on E: Exception do
        ShowMessage(E.Message);
    end;
  end;

  inherited;

end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 11:46 am    Assunto: Responder com Citação

strak2012 escreveu:
Ficaria algo como isso cá:
Código:
procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
 myThread : TThread;
begin
  myThread := TThread.CreateAnonymousThread(
  procedure
var
  I: Integer;
  Controller: TSincronismoController;
  ObjetoJson: TJSONObject;
  ParametroJson, StringJSON: TStringList;
  Resp: TStringStream;
  Resposta: String;
  Url: String;
  IdHTTP: TIdHTTP;
  DirJSON: String;
  ArquivoJson: TIdMultipartFormDataStream;
  VendaController: TVendaController;
  TTheadEnvio: TEnvioThread;
begin
  try
    IdHTTP := TIdHTTP.Create(nil);
    ParametroJson := TStringList.Create;
    StringJSON := TStringList.Create;
    try
      Controller := TSincronismoController.Create;
      Controller.oVendaAtual := Venda;
      Resp := TStringStream.Create('');
      with IdHTTP do
      begin
        IOHandler := IdSSLIOHandlerSocketOpenSSL1;
        ReadTimeout := 0;
        AllowCookies := True;
        ProxyParams.BasicAuthentication := True;
        ProxyParams.ProxyPort := 0;
        Request.CustomHeaders.Clear;
        Request.Clear;
        Request.ContentLength := -1;
        Request.ContentRangeEnd := 0;
        Request.ContentRangeStart := 0;
        Request.ContentEncoding := 'multipart/form-data';
        Request.CharSet := 'utf-8';
        // Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
        IdHTTP.Request.UserAgent :=
          'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
        // Adriano
        Request.ContentType := 'application/json';
      end;
      try
        Application.ProcessMessages;
        TrimAppMemorySize;
        ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
          IfThen(Venda <> nil, Venda.Id, 0));
        DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
          TB_VENDA + '.txt';
        try
          DeleteFile(DirJSON);
          StringJSON.Clear;
          StringJSON.Add(ObjetoJson.ToString);
          StringJSON.SaveToFile(DirJSON);
          Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
          ArquivoJson := TIdMultipartFormDataStream.Create;
          ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
          IdHTTP.Request.Referer := Url;
          try
            IdHTTP.Post(Url, ArquivoJson, Resp);
          except
            on E: Exception do
              ShowMessage('Error on request: '#13#10 + E.Message);
          end;

          DeleteFile(DirJSON);
        except
          // Exceção silenciosa
        end;
        // ShowMessage(Resp.DataString);
        // Resp.LoadFromFile('C:\respostaJson.txt');
        Resp.SaveToFile('C:\respostaJson.txt');
        TrataJsonRetorno(Resp);
        Resp.Clear;
        IdHTTP.Disconnect;
      finally
        try
          FreeAndNil(ObjetoJson);
          if Venda <> nil then
          begin
            Venda.Sincronizado := True;
            try
              VendaController := TVendaController.Create;
              VendaController.SetIdWeb(Venda);
            finally
              FreeAndNil(VendaController);
            end;
          end;
        except
          on E: Exception do
          begin
            // ShowMessage(e.Message);
            if ObjetoJson <> nil then
              ObjetoJson.Free;
          end;
        end;
      end;
    finally
      FreeAndNil(Controller);
      FreeAndNil(Resp);
      FreeAndNil(ParametroJson);
      FreeAndNil(StringJSON);
      FreeAndNil(IdHTTP);
      FreeAndNil(ArquivoJson);
    end;
  except
    on E: Exception do
      // ShowMessage(e.Message);
  end;
  end);
  myThread.FreeOnTerminate:=true;
  myThread.start;
end;
Hum vc criou a thread dentro do metodo, não tinha feito assim, vou tentar amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 1:15 pm    Assunto: Responder com Citação

Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;

Para chamar a thread
Código:
procedure TfrmPagamento.SincronizaVenda;
begin
  try
    try
      frmSincronismo := TFrmSincronismo.Create(Self);
      frmSincronismo.EnviaDadosVenda(oVendaAtual);
    finally
      FreeAndNil(frmSincronismo);
    end;
  except
    // Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
    // a venda apenas fica como não sincronizada.
  end;
end;


Código:
if not Assigned(frmFinalizaVenda) then
            frmFinalizaVenda := TfrmFinalizaVenda.Create(Self);
          try
            // Verifico se tem internet para sincronizar a venda
            if TemInternet then
              SincronizaVenda;

            frmFinalizaVenda.enumFormQueChamou := tfFormFrenteCaixa;
            frmFinalizaVenda.ValorTotalVenda := ValorTotalVenda;
            frmFinalizaVenda.ValorTotalDesconto := ValorTotalDesconto;
            frmFinalizaVenda.oValorInicialCaixa := oValorInicialCaixa;
            frmFinalizaVenda.oVendaAtual := oVendaAtual;
            frmFinalizaVenda.oCliente := oCliente;
            frmFinalizaVenda.oFuncionario := oFuncionario;
            frmFinalizaVenda.ListaVendaItens := ListaVendaItens;
            frmFinalizaVenda.ListaPagamentos := ListaPagamentos;
            frmFinalizaVenda.Impressora := Impressora;
            frmFinalizaVenda.ShowModal;
          finally
            frmFinalizaVenda.Release;
            frmFinalizaVenda := nil;
          end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 1:23 pm    Assunto: Responder com Citação

adriano_servitec escreveu:
Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;

Para chamar a thread
Código:
procedure TfrmPagamento.SincronizaVenda;
begin
  try
    try
      frmSincronismo := TFrmSincronismo.Create(Self);
      frmSincronismo.EnviaDadosVenda(oVendaAtual);
    finally
      FreeAndNil(frmSincronismo);
    end;
  except
    // Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
    // a venda apenas fica como não sincronizada.
  end;
end;


Código:
if not Assigned(frmFinalizaVenda) then
            frmFinalizaVenda := TfrmFinalizaVenda.Create(Self);
          try
            // Verifico se tem internet para sincronizar a venda
            if TemInternet then
              SincronizaVenda;

            frmFinalizaVenda.enumFormQueChamou := tfFormFrenteCaixa;
            frmFinalizaVenda.ValorTotalVenda := ValorTotalVenda;
            frmFinalizaVenda.ValorTotalDesconto := ValorTotalDesconto;
            frmFinalizaVenda.oValorInicialCaixa := oValorInicialCaixa;
            frmFinalizaVenda.oVendaAtual := oVendaAtual;
            frmFinalizaVenda.oCliente := oCliente;
            frmFinalizaVenda.oFuncionario := oFuncionario;
            frmFinalizaVenda.ListaVendaItens := ListaVendaItens;
            frmFinalizaVenda.ListaPagamentos := ListaPagamentos;
            frmFinalizaVenda.Impressora := Impressora;
            frmFinalizaVenda.ShowModal;
          finally
            frmFinalizaVenda.Release;
            frmFinalizaVenda := nil;
          end;


Coloquei um try/exception ao executar o frmFinalizaVenda.ShowModal; e retornou de novo access violation, provavelmente o que vem da trheads, como não consegui debugar ela não sei afirmar de onde gera o access violation
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 15, 2017 1:31 pm    Assunto: Responder com Citação

[quote="adriano_servitec"]Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;

Para chamar a thread
Código:
procedure TfrmPagamento.SincronizaVenda;
begin
  try
    try
      frmSincronismo := TFrmSincronismo.Create(Self);
      frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá neste método
    finally
      FreeAndNil(frmSincronismo); // a thread cá já deve ter sua finalização concluída para não dá AV, assim melhor usar o freeandnil dentro da própria thread
    end;
  except
    // Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
    // a venda apenas fica como não sincronizada.
  end;
end;

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 15, 2017 1:34 pm    Assunto: Responder com Citação

Tente desta forma:

Código:
procedure TfrmPagamento.SincronizaVenda;
begin
    try
      frmSincronismo := TFrmSincronismo.Create(Self);
      frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá neste método, o medoto EnviaDadosVenda ja possui o freenandinil para o frmSincronismo
  except
    // Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
    // a venda apenas fica como não sincronizada.
  end;
end;

procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
 myThread : TThread;
begin
  myThread := TThread.CreateAnonymousThread(
  procedure
var
  I: Integer;
  Controller: TSincronismoController;
  ObjetoJson: TJSONObject;
  ParametroJson, StringJSON: TStringList;
  Resp: TStringStream;
  Resposta: String;
  Url: String;
  IdHTTP: TIdHTTP;
  DirJSON: String;
  ArquivoJson: TIdMultipartFormDataStream;
  VendaController: TVendaController;
  TTheadEnvio: TEnvioThread;
begin
  try
    IdHTTP := TIdHTTP.Create(nil);
    ParametroJson := TStringList.Create;
    StringJSON := TStringList.Create;
    try
      Controller := TSincronismoController.Create;
      Controller.oVendaAtual := Venda;
      Resp := TStringStream.Create('');
      with IdHTTP do
      begin
        IOHandler := IdSSLIOHandlerSocketOpenSSL1;
        ReadTimeout := 0;
        AllowCookies := True;
        ProxyParams.BasicAuthentication := True;
        ProxyParams.ProxyPort := 0;
        Request.CustomHeaders.Clear;
        Request.Clear;
        Request.ContentLength := -1;
        Request.ContentRangeEnd := 0;
        Request.ContentRangeStart := 0;
        Request.ContentEncoding := 'multipart/form-data';
        Request.CharSet := 'utf-8';
        // Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
        IdHTTP.Request.UserAgent :=
          'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
        // Adriano
        Request.ContentType := 'application/json';
      end;
      try
        Application.ProcessMessages;
        TrimAppMemorySize;
        ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
          IfThen(Venda <> nil, Venda.Id, 0));
        DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
          TB_VENDA + '.txt';
        try
          DeleteFile(DirJSON);
          StringJSON.Clear;
          StringJSON.Add(ObjetoJson.ToString);
          StringJSON.SaveToFile(DirJSON);
          Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
          ArquivoJson := TIdMultipartFormDataStream.Create;
          ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
          IdHTTP.Request.Referer := Url;
          try
            IdHTTP.Post(Url, ArquivoJson, Resp);
          except
            on E: Exception do
              ShowMessage('Error on request: '#13#10 + E.Message);
          end;

          DeleteFile(DirJSON);
        except
          // Exceção silenciosa
        end;
        // ShowMessage(Resp.DataString);
        // Resp.LoadFromFile('C:\respostaJson.txt');
        Resp.SaveToFile('C:\respostaJson.txt');
        TrataJsonRetorno(Resp);
        Resp.Clear;
        IdHTTP.Disconnect;
      finally
        try
          FreeAndNil(ObjetoJson);
          if Venda <> nil then
          begin
            Venda.Sincronizado := True;
            try
              VendaController := TVendaController.Create;
              VendaController.SetIdWeb(Venda);
            finally
              FreeAndNil(VendaController);
            end;
          end;
        except
          on E: Exception do
          begin
            // ShowMessage(e.Message);
            if ObjetoJson <> nil then
              ObjetoJson.Free;
          end;
        end;
      end;
    finally
      FreeAndNil(Controller);
      FreeAndNil(Resp);
      FreeAndNil(ParametroJson);
      FreeAndNil(StringJSON);
      FreeAndNil(IdHTTP);
      FreeAndNil(ArquivoJson);
    end;
  except
    on E: Exception do
      // ShowMessage(e.Message);
  end;
  FreeAndNil(self); // não sei se o self seria visto cá, caso não precisa passar uma referencia valida
  end);
  myThread.FreeOnTerminate:=true;
  myThread.start;
end;

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 1:38 pm    Assunto: Responder com Citação

[quote="strak2012"]
adriano_servitec escreveu:
Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;

Para chamar a thread
Código:
procedure TfrmPagamento.SincronizaVenda;
begin
  try
    try
      frmSincronismo := TFrmSincronismo.Create(Self);
      frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá neste método
    finally
      FreeAndNil(frmSincronismo); // a thread cá já deve ter sua finalização concluída para não dá AV, assim melhor usar o freeandnil dentro da própria thread
    end;
  except
    // Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
    // a venda apenas fica como não sincronizada.
  end;
end;


Sim esta sendo chamado aqui
Código:
 frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá



Citação:
FreeAndNil(frmSincronismo); // a thread cá já deve ter sua finalização concluída para não dá AV, assim melhor usar o freeandnil dentro da própria thread

E o que devo fazer então, para chamar o método?
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 15, 2017 1:50 pm    Assunto: Responder com Citação

O frmFinalizaVenda.ShowModal deve ser um metodo tb chamado dentro da thread, ou ao menos deve esperar que a thread seja concluida.

Pense que você pode estar chegando no método frmFinalizaVenda.ShowModal antes mesmo da thread tenha concluida, assim a thread vai tentar manipular coisas que ja não existe mais por conta que o frmFinalizaVenda.ShowModal ja foi chamado antes dando assim o AV.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 15, 2017 1:58 pm    Assunto: Responder com Citação

strak2012 escreveu:
O frmFinalizaVenda.ShowModal deve ser um metodo tb chamado dentro da thread, ou ao menos deve esperar que a thread seja concluida.

Pense que você pode estar chegando no método frmFinalizaVenda.ShowModal antes mesmo da thread tenha concluida, assim a thread vai tentar manipular coisas que ja não existe mais por conta que o frmFinalizaVenda.ShowModal ja foi chamado antes dando assim o AV.


Então eu preciso que este form seja liberado para dar continuidade mesmo que a thread esteja em execução. Se não fico aguardando do mesmo jeito.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
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
Ir à página 1, 2  Próximo
Página 1 de 2

 
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