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;
}
 

Çevrimiçi personel

Forum istatistikleri

Konular
7,922
Mesajlar
130,966
Üyeler
3,173
Son üye
apnr

Son kaynaklar

Son profil mesajları

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.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
az bilgili çok meraklı
Back
Top