Pergunta

Vou desenvolver um pequeno servidor dedicado em C/C ++ que exigirá tempo de atividade para sempre. Eu tenho analisado algumas funções de tempo, pois o tempo de milissegundos é necessário para os cálculos. Tenho 2 problemas que estou enfrentando:

  1. O uso de um número inteiro de 32 bits para armazenar o número de milissegundos desde o início da operação será envolvido em cerca de 49 dias de redefinição para zero. Eu pensei em usar números inteiros de 64 bits, usando o gettimeofday para recuperar microssegundos, mas isso me leva à segunda parte.

  2. Não parece haver nenhum sistema padrão para obter milissegundos decorridos que são a plataforma independente

O que devo fazer para resolver esses dois problemas?

Foi útil?

Solução

  1. Use um número inteiro de 64 bits, presumindo que lhe dê tempo suficiente

  2. Você está certo; não há padrão. Uma possibilidade seria usar o Boost DateTime Biblioteca, alternadamente, encontre outro ou role o seu próprio.

Boa sorte!

Outras dicas

Como já foi dito, o primeiro problema que você vai confrontar vai obter um tempo confiável para o milissegundo.

Admito que sou um pouco faseado pela pergunta.

Eu posso entender a necessidade de tempo preciso (nível de milissegundo, até microssegundo), mas o tempo de 50 dias em um nível de milissegundos parece ... estranho.

Talvez você deva revisar sua necessidade primeiro, mas é raro precisar de mais de 6 ou 7 dígitos significativos ... e tenho medo de que você esteja tentando obter um tamanho único para todos os objetos de duração.

Talvez você deva classificar suas durações:

  • Alguns minutos na maioria> Use a precisão de milissegundos
  • Caso contrário> Use a segunda precisão (a famosa contagem desde 1º de janeiro de 1970)

Porque ... qual é o sentido de 1/10 segundo na escala de 2 meses?

Óbvio. Use números inteiros de 64 bits com código específico da plataforma para obter o número de milissegundos. No Unix, incluindo OSX, você quer gettimeofday. No Windows, boa sorte obtendo uma fonte de tempo confiável de milissegundos-granularidade; a Código na biblioteca TCL para fazer isso é realmente complexo, pois existem algumas pegadinhas no mal na área.

Resposta a 1: Se o "tempo de milissegundos" que você está medindo estiver em cerca de 20 dias, você poderá subtrair os tempos como valores não assinados e verificar o resultado como valor assinado. Isso deve dar o resultado certo com os temporizadores de embalagem (embalando de 0xffffffffff a 0x00000000). Se o seu tempo for superior a 20 dias, você precisará de mais bits.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top