AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79577897
Accepted
Mike at Bookup
Mike at Bookup
Asked: 2025-04-17 02:40:16 +0800 CST2025-04-17 02:40:16 +0800 CST 2025-04-17 02:40:16 +0800 CST

NetHTTPClient no Delphi 12 vezes o tempo limite quando o download está funcionando

  • 772

Meu projeto Delphi 12 está usando o componente NetHTTPClient para baixar um arquivo de 2 GB.

O download progride rapidamente e sem interrupções, mas depois de 60 segundos (cerca de um terço do download) é gerada uma exceção dizendo que a conexão expirou.

Ajustei as três configurações de tempo (ResponseTimeout, SendTimeout e ConnectionTimeout) dos valores padrões de 60.000 (um minuto) para 600.000 e isso contornou o problema porque o download leva cerca de três minutos.

Como posso fazer com que ele só gere um tempo limite de conexão quando o tempo limite da conexão realmente expirar?

http
  • 2 2 respostas
  • 39 Views

2 respostas

  • Voted
  1. Best Answer
    Remy Lebeau
    2025-04-17T04:35:30+08:002025-04-17T04:35:30+08:00

    Na maioria das plataformas, o ResponseTimeouté o tempo máximo permitido para a conclusão de uma resposta. O padrão é 1 minuto. Ao defini-lo para 10 minutos, você estará dando tempo suficiente para a conclusão do download.

    O ResponseTimeoutcomportamento depende da plataforma em que seu código está sendo executado.

    No Windows, TNetHTTPClientusa WinHTTP, e os documentos do MSDN dizem o seguinte para a WinHTTPSetTimeouts()função:

    [em] nReceiveTimeout

    Um valor do tipo inteiro que especifica o tempo limite, em milissegundos, para receber uma resposta a uma solicitação. Se uma resposta demorar mais que esse tempo limite, a solicitação será cancelada. O valor inicial é 30.000 (30 segundos).

    ...

    Um valor de 0 ou -1 define um tempo limite de espera infinito. Um valor maior que 0 define o valor do tempo limite em milissegundos. Por exemplo, 30.000 definiria o tempo limite para 30 segundos. Todos os valores negativos diferentes de -1 fazem com que a função falhe com ERROR_INVALID_PARAMETER.

    No Linux, TNetHTTPClientusa Curl, e a documentação do Curl diz o seguinte para a opção CURLOPT_TIMEOUT/ :CURLOPT_TIMEOUT_MS

    o tempo máximo em [mili]segundos que você permite que toda a operação de transferência leve. Tudo, do início ao fim. Normalmente, as pesquisas de nomes podem levar um tempo considerável, e limitar as operações corre o risco de abortar operações perfeitamente normais.

    ...

    O tempo limite de conexão definido com CURLOPT_CONNECTTIMEOUT está incluído neste tempo limite geral de cobertura total.

    Se ResponseTimeoutfor menor que 0, TNetHTTPClientdefinirá a CURLOPT_TIMEOUT_MSopção como 0, ou seja, infinita.

    No MacOS e no iOS, TNetHTTPClientusa URLSession, e os documentos da Apple dizem o seguinte sobre a URLSessionConfiguration.timeoutIntervalForResourcepropriedade:

    O tempo máximo que uma solicitação de recurso deve levar.

    Esta propriedade determina o intervalo de tempo limite do recurso para todas as tarefas dentro das sessões com base nesta configuração. O intervalo de tempo limite do recurso controla quanto tempo (em segundos) esperar pela transferência de um recurso inteiro antes de desistir. O temporizador do recurso inicia quando a solicitação é iniciada e conta até que a solicitação seja concluída ou esse intervalo de tempo limite seja atingido, o que ocorrer primeiro.

    Se ResponseTimeoutfor menor que 0, TNetHTTPClientdefinirá timeoutIntervalForResourcecomo 1 ano.

    No Android, TNetHTTPClientusa URLConnection, e a documentação do Android Java diz o seguinte para o URLConnection.setReadTimeout()método:

    Define o tempo limite de leitura para um tempo limite especificado, em milissegundos. Um valor diferente de zero especifica o tempo limite ao ler do fluxo de entrada quando uma conexão é estabelecida com um recurso. Se o tempo limite expirar antes de haver dados disponíveis para leitura, uma exceção java.net.SocketTimeoutException será gerada. Um tempo limite igual a zero é interpretado como um tempo limite infinito.

    Isso significa que, ResponseTimeoutna verdade, há um tempo limite por byte, e não um tempo máximo de resposta, como em outras plataformas. Veja: Entendendo URLConnection.setReadTimeout() .

    Então, para responder à sua pergunta, se você definir o ResponseTimeoutcomo <= 0em todas as plataformas, o sistema TNetHTTPClientaguardará indefinidamente (ou quase isso) a conclusão da resposta. Mas, como você espera que o download seja concluído em 3 minutos, definir um tempo limite de 10 minutos é razoável.

    Regras semelhantes se aplicam à ConnectTimeoutpropriedade (tempo máximo para conectar ao servidor) e SendTimeoutà propriedade (tempo máximo para enviar uma solicitação) - exceto que TNetHTTPClientnão parece ser implementado SendTimeoutpara Android e Linux neste momento, apenas para Windows e MacOS/iOS.

    • 3
  2. fpiette
    2025-04-17T14:40:04+08:002025-04-17T14:40:04+08:00

    TNetHTTPClientpossui um evento OnReceiveDataque permite saber se o servidor ainda está enviando dados regularmente. Para isso, você pode registrar a hora atual ao iniciar a solicitação e, a partir do OnReceiveDataevento, salvar a hora novamente e permitir que a transferência continue. Além disso, adicione um TTimer para verificar periodicamente o tempo salvo em relação à hora atual e determinar se algo foi recebido nesse meio tempo.

    Veja a documentação .

    • 2

relate perguntas

  • Quando o navegador rejeita uma solicitação CORS?

  • Como os domínios da lista branca são realmente aplicados por alguns dos grandes provedores de API?

  • Como enviar uma solicitação http usando apenas a caixa http?

  • Como o servidor com HTTP 1.1 pode entender o cliente que usa HTTP 2?

  • Rust reqwest::multipart::Formulário não funciona

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve