timespec zaman ilerletme

turkuazaga

Üye
Katılım
23 Aralık 2018
Mesajlar
58
struct timespec yapısında ifade edilen mutlak zamanı belli bir süre kaydırmak için şöyle bir fonksiyon yazdım ama bazan doğru çalışıyor bazan yanlış.Bir saattir ben koda bakıyorum kod bana bakıyor ama hiç ilerleme yok prolem ne olabilir?

Kod:
void timespec_msoffset(struct timespec *ts, int msoffset)
{
      int64_t at=(uint64_t)ts->tv_sec*1000000000+ts->tv_nsec;
      at+=msoffset*1000000;
      ts->tv_sec=at/1000000000;
      ts->tv_nsec=at%1000000000;
}
 
Son düzenleme:
Programı aynı girdilerle tekrar tekrar çalıştırırsan her seferinde farklı sonuç mu alıyorsun? Yoksa fonksiyona bazı parametreler verilirse doğru bazılarında yanlış sonuç mu çıkıyor? Bunların ikisinin anlamı çok farklı.
 
Programda pthread_cond_timedwait kullaniyorum ve en fazla 10 saniye beklemesini istiyorum. Değişik timeout sürelerle deniyorum bazı değerlerde düzgün bazılarında fonksiyon hemen anında ETIMEDOUT döndürüyor.
 
Sanırım msoffset argümanı milisaniye olarak ne kadar zaman ekleneceğini ifade ediyor. Sana bir ipucu vereyim bakalım bulabilecek misin. -2000 ... +2000 aralığındaki değerler için her zaman doğru çalışıyor mu? -5000 .. +5000 aralığının dışındaki değerlerde de hep yanlış çalışıyor mu?
 
Overflow olabilir diyorsunuz herhalde.Onu gözönünde bulundurdum ve mutlak zamanı 64 bitlik (int64_1) bir değişkene atıyorum ve gereken zaman ilerletmesini veya geriletmesini elde ettikten sonra da tekrar timespec'e dönüştürüyorum.Overflow olmaması gerekir.
 
1 saniye ile denedim doğru çalıştı 30 saniye ile denedim hemen timeout yedi.O halde anlamadığım bir şekilde overflow oluyor ama nerede göremiyorum.
 
Öncelikle program kodu eklerken kodun yazıldığı dili CODE kutusunda belirt böylece o dile göre renklendirme yapsın ve daha kolay anlaşılsın kod. Bir de programda kullandığın ifadeler ve operatörler arasında da bir boşluk bırak. Böyle herşey bitişik olunca anlaması çok zor oluyor, çok yanıltır seni.

Kod:
void timespec_msoffset(struct timespec* ts, int msoffset)
{
   int64_t at = (uint64_t)ts->tv_sec * 1000000000 + ts->tv_nsec;
   at += msoffset * 1000000;
   ts->tv_sec = at / 1000000000;
   ts->tv_nsec = at % 1000000000;
}

Problem taşma meydana gelmesi. Tamam zamanı 64 bite dönüştürüyorsun, ama sonra 32 bitlik bir sayıyı (msoffset) 1000000 ile çarpıyorsun. Eğer msoffset 2148 veya daha büyük ise tam da burada bir taşma meydana gelir, sayı negatife düşer ve süreyi ileri alacağına geri almış olursun. Doğrusu orada msoffset değişkenini de önce 64 bite dönüştürmek:

Kod:
void timespec_msoffset(struct timespec* ts, int msoffset)
{
   /* once timespeci 64 bit integer yap */
   int64_t at = (uint64_t)ts->tv_sec * 1000000000 + ts->tv_nsec;

   /* msoffset kadar kaydir. Ama once msoffset degiskenini 64 bit yap !!! HATA BURADA */
   at += (int64_t)msoffset * 1000000;

   /* tekrar timespece donustur */
   ts->tv_sec = at / 1000000000;
   ts->tv_nsec = at % 1000000000;
}
 
Veya

Kod:
void timespec_msoffset(struct timespec* ts, int msoffset)
{
    int64_t at = ts->tv_sec * 1000000000LL + ts->tv_nsec;
    at += msoffset * 1000000LL;
    ts->tv_sec = at / 1000000000LL;
    ts->tv_nsec = at % 1000000000LL;
}
 

Forum istatistikleri

Konular
8,284
Mesajlar
136,019
Üyeler
3,289
Son üye
osayi

Son kaynaklar

Son profil mesajları

Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
Back
Top