Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
Pucy

C++ Pause ve Sleep fonk. Hakkında.

Önerilen Mesajlar

Selamu aleyküm.

Ben c++ yeni öğreniyorum pause ve sleep kullanıyorum projemde 2 si forumu dondurdugu için bu fonksiyonun yerine başka ne yazabilirim?

İletiyi paylaş


Link to post
Sitelerde Paylaş
Konu Sahibi tarihinde gönderildi (düzenlendi)
3 dakika önce, OzkanOzdemir yazdı:

Tam olarak ne yapmak istiyorsun onu söyle projeni anlat ki ona göre şöyle yapabilirsin şu yolu izleyebilirsin diye çözümler sunabileyim.

Kafandaki sistemi tam olarak anlat.

void Pause(DWORD milisecond)
{
DWORD current = GetTickCount();

while(GetTickCount() - current <= milisecond)
{
//Sleep(1);
Application->ProcessMessages();
}
}

Yukarıda yazmış oldugum pause fonk. forumumu donduruyor belirlediğim saniyeye göre. Örnek veriyorum ben fonksiyonumun arasına Pause(1500); yazdım 1500 milisaniye formum donuyor ve işleme devam ediyor .Bunu donmamasını istiyorum ne yapmam gerek bunun için?

tarihinde Pucy tarafından düzenlendi

İletiyi paylaş


Link to post
Sitelerde Paylaş
Admin

Form ekranının donmasının sebebi form classının main threadi üzerinde çalışması yani single thread çalışıyor programın arka plandaki yapılan işlemler ile form ekranının çalışması tek thread üzerinden işlem gördüğünden dolayı sen nerede Sleep kullanırsan kullan doğrudan main threadini bekletmiş oluyorsun ve böylelikle form ekranı render edilemiyor.

Ne için kullanacaksın şuan bu durdurma olayını bilmiyorum ama tahmin ettiğim yer ise büyük ihtimal ile skill casting işleminde belli bir süre bekledikten sonra flying yada effecting paketini atarak skilli vurdurma işlemini yapıyorsun.

Main threadi üzerinden kullanmadan ikinci bir thread açacaksın. O thread üzerinden işlemlerini gerçekleştireceksin ama yine Sleep komutunu kullanmayacaksın bu gibi olaylarda bu sefer de o thread üzerindeki işlemleri bekletmiş olursun ve stabil çalışmasını engellersin. Örneğin pot basımını milisaniyelik olarak kontrol etmek varken sen 1.5 saniye de bir gecikme ile kontrol etmiş olursun. Bu yüzden Sleep fonksiyonunu sadece oluşturacağın thread işlerlminin sonsuz döngünün kaç milisaniyede bir tetikleneceğini belirtmek adına kullanmalısın yoksa bu gibi işlemlerde kullanmayacaksın saçmalıktan başka bir şey değil.

Gelelim nasıl yapacağına sen şuan stabil casting süresini her skill için 1.5 saniye tanımlamışsın RAM içerisinden TBL verilerini çektirip doğrudan skillin gerçekteki casting süresine erişim sağlayabilirsin böylelikle tüm skillerin ne kadar süre bekleyeceğini bilir ve yine stabil bir sistem elde etmiş olursun Client ile farkın kalmaz.

Devam edelim üst taraftaki TBL olayını yaptığını farzedelim bir tane unsigned long long m_tCastingTime; diye bir değişken tanımla Skill kullanırken en başta şu kontrolü yapacaksın.

if (m_tCastingTime + pSkill->m_sCasting > std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count())

Yukarıdaki işlem şuan casting yaparken 2. bir skill kullanımını engellemiş ve casting süresini beklemiş olmanı sağlayacak.

Skill kullanımını gerçekleştirdikten sonra paketi gönderdikten sonra yani bunu tabi ki casting işleminin success paketi serverdan geldikten sonra da yapabilirsin.

m_tCastingTime = pSkill->m_sCasting + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();

Yukarıdaki verdiğim kod ise casting süresini şuanki zamana göre atama işlemini yapıyor ki yukarıdaki if kontrolü ile 2. skillin basılmasını bekleyelim.

Gerisini zaten mantığına göre oturtursun. Eğer ki bilgin yeterli değilse thread işlemlerini araştırmanı öneririm thread işlemlerinin nasıl gerçekleştiğini nerede kullanıldığını anlarsan zaten donma sebebini daha net anlayacaksın.

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...