C++ Thread. Zamanlama tutmuyor.

Başlatan Klein, 25 Mart 2013, 19:45:36

Klein

TThread sınıfından bir nesne türetiyorum.  Execute metodunda bazı işlemler yapıyorum. Zamanlama için de  Sleep(1) ile 1 milisaniye uyutuyorum. 
Builder IDE'si (Embarcadero xe2)  açokken zamanlamalarda bir problem yok. Ancek IDE kapanır kapanmaz süre neredeyse 10 kat uzuyor.
Programı IDE içerisinden çalıştırmasam bile  IDE açıldığında  zamanlama normale dönüyor.

Program derlenirken bir yerde uyarı veriyor. Sorunun buradan kaynaklandığını düşünüyorum.

[BCC32 Warning] System.DateUtils.hpp(132): W8058 Cannot create pre-compiled header: initialized data in header

hataya neden olan satır


static const System::Extended OneMillisecond = 1.157407E-08;

muhtemelen sorunun kaynağı bu. Ama bu satıra neden kızıyor anlamadım.
bunun gibi başka satırlar da var ama onlarda sorun yok.
Örneğin bu satıra uyarı vermiyor.
static const System::Extended OneSecond = 1.157407E-05;

t2

Thread çalışırken sorun yaşıyordum  başka threadler duruyordu bunu gidermek için execute olayına sleep(1) eklemiştim işe yaradı. bu esnada diğer thradler çalışabiliyordu.

sonradan sleep(1) yerine sleep(0) yazdım o da işe yaradı.

t2

#2
Boğma diye bir durum yok. Çok sayıda thread çalışıyor.  Normalde  iş yoksa thread suspend halde bekliyor. Başka thread bunu ateşliyor. fakat nedense ateşlemeden önce sleep(0) iyi oldu.

Application->ProcessMessages() çağırırsak tüm işlem ana threade senkron olmaya çalışır arka planda iş yapılacak diye beklemenin anlamı kalmaz. ana thread meşgulse, diğerleri de durur. hatta bu sorunu görmek ve emin olmak için ana form üzerine düğme koyup sleep(30000)gibi bekleme yaptırıyorum. eğer bu esnada diğer threadler donmuşsa program kötü olmuş demektir. 

Fark ettiğim bir durum da şu : diyelim timer var. timer olayında uzun bir işlem yapıyoruz diyelim bu işlem timer süresini de aşıyor olsun. tek çekirdekli makinede oişlem bitmeden yeniden timer olayı tetiklenmez. fakat birden fazla çekirdek varsa tetikleniyor. böyle bir sorun varsa timer olayında ilk iş timeri durdurmak. işler bitince yeniden aktif etmek  şeklinde bir çözüm elde ettim. Belkide yanlış tespitler yapıp uyduruma bir çözüm yapmış da olabilirim.