<chrono> 'dan int milli ve float saniye olarak süre nasıl alınır?


94

Zamanlayıcılar ve süreler için krono kitaplığını kullanmaya çalışıyorum.

Duration frameStart;(Uygulama başlangıcından itibaren) ve Duration frameDelta;(kareler arasındaki süre ) a sahip olmak istiyorum

frameDeltaSüreyi milisaniye ve kayan saniye olarak alabilmem gerekiyor .

Bunu yeni c ++ 11 <chrono>kitaplıklarıyla nasıl yaparsınız ? Üzerinde çalışıyorum ve Google'da arama yapıyorum (bilgi seyrek). Kod oldukça şablonlu ve özel dökümler ve şeyler gerektiriyor, bu kitaplığı nasıl doğru kullanacağımı çözemiyorum.


Süreyi oranlı bir süreye (veya milisaniye) atayın ve ardından çağırın count...
K-ballo

otomatik delta = süre_ yayın <saniye> (kareDelta). sayım (); Bunun gibi? Bir şamandıra değil, uzun süre döner.
EddieV223

3
@ K-ballo, eğer süre atadığınız türden daha yüksek bir çözünürlüğe sahipse, hassasiyet kaybını önlemek için atama kötü biçimlendirilecektir. Kayan nokta gösterimi olan bir süre kullanmanız veya kullanmanız gerekirduration_cast
Jonathan Wakely

@JonathanWakely: Oh, o zaman yanlış kullanıyorum! :(
K-ballo

Yanıtlar:


154

Aradığınız bu mu?

#include <chrono>
#include <iostream>

int main()
{
    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::duration<float> fsec;
    auto t0 = Time::now();
    auto t1 = Time::now();
    fsec fs = t1 - t0;
    ms d = std::chrono::duration_cast<ms>(fs);
    std::cout << fs.count() << "s\n";
    std::cout << d.count() << "ms\n";
}

benim için yazdırdığı:

6.5e-08s
0ms

2
neden kullanmaz autoüzerinde fsve d?
TemplateRex

27
@rhalbersma: is sonucu olarak autokullanımı iyi olur . Ancak için bir sonuç, uygun olmaz türü vardır mutlaka aynı tip değildir . Örneğin benim sistemimde öyle . Dolayısıyla , bu satırda integral tabanlıdan kayan tabanlıya örtük bir dönüşüm var , çünkü yalnızca hedef türü ile belirtilmiş . dduration_cast<ms>msfs autot1-t0high_resolution_clock::durationduration<float>duration<long long, nano>nanosecondssecondsfsec
Howard Hinnant

2
Bu yararlı bilgi. Sadece merak: auto fs = std::chrono::duration_cast<fsec>(t1 - t0);bilgiçlik abartı olur mu?
TemplateRex

@rhalbersma: Bu da işe yarar ve aynı şeyi yapar. Hangisinin tercih edileceğine gelince, bana göre tamamen stilistik.
Howard Hinnant

2
Bazı gerçek dünya senaryolarında (örneğin, ms derleyicisi ve kitaplıklar) 'high_resolution_clock' mikrosaniye sırasına göre zamanları kaçıracağını ve bu kodun sıfırları
tüküreceğini unutmayın

19

Ne istediğine dair bir tahmin yürütmek. Milisaniye kare zamanlayıcısına göre aşağıdaki gibi davranan bir şey aradığınızı varsayıyorum,

double mticks()
{
    struct timeval tv;
    gettimeofday(&tv, 0);
    return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;
}

ama std::chronobunun yerine kullanır ,

double mticks()
{
    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::duration<float, std::milli> duration;

    static clock::time_point start = clock::now();
    duration elapsed = clock::now() - start;
    return elapsed.count();
}

Bu yardımcı olur umarım.


Stack Overflow'a hoş geldiniz. Kodunuza ek ayrıntılar verebilirseniz harika olur. Başkalarının neyi başarmaya çalıştığınızı ve çözümlerinizin nasıl çalıştığını anlamalarına yardımcı olur. Teşekkürler!
Luís Cruz

Bilginize - bu, incelediğim düzinelerce içinde EN AÇIK, en yararlı örnekti. Sonsuza dek kafa karıştıran krono işlevlerini anlaşılır kıldığınız için teşekkürler.
SMGreenfield

15

"Milisaniye ve kayan saniye" ne anlama geliyor bilmiyorum ama bu size bir fikir vermeli:

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
  auto then = std::chrono::system_clock::now();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto now = std::chrono::system_clock::now();
  auto dur = now - then;
  typedef std::chrono::duration<float> float_seconds;
  auto secs = std::chrono::duration_cast<float_seconds>(dur);
  std::cout << secs.count() << '\n';
}

Onun gerçek istiyor herhalde countbir şekilde float?
K-ballo

1
Sonunda yazdırılan şey budur. Ama milisaniyeleri bir tam sayı olarak mı, yoksa saniyeyi geçen milisaniyeler mi istediğini bilmiyordum.
Jonathan Wakely

Bir chrono :: duration'dan milisaniye olarak gösterilen süreyi veya kayan saniyeleri (bir saniyenin kesri) elde edebilmek istiyorum
EddieV223

Howard'ın cevabı tam olarak bunu yapıyor
Jonathan Wakely 18'13

8

In AAA tarzı kullanılarak açıkça deyim başlatıcısı yazmış :

#include <chrono>
#include <iostream>

int main(){
  auto start = std::chrono::high_resolution_clock::now();
  // Code to time here...
  auto end = std::chrono::high_resolution_clock::now();

  auto dur = end - start;
  auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur);
  auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur);
  std::cout << i_millis.count() << '\n';
  std::cout << f_secs.count() << '\n';
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.