İbrahim TELCİ Posted November 2, 2020 Share Posted November 2, 2020 Merhabalar; Aşağıda özellikleri yazılı bir server sunucuda IIS üzerinden hazırladığım uygulamayı yayınlıyorum. Uygulamada Server Module üzerinde çalışan bir ThreadTimer ve Main Form üzerinde çalışan bir Timer nesnem var. Server module üzerinde çalışan ThreadTimer veritabanını kontrol ediyor ve MainModule içerisindeki Boolean bir değişkeni tetikliyor. Mainform üzerindeki Timer bu değişkeni kontrol ediyor ve eğer true gelirse sayfa üzerindeki bilgileri yenileyip değişkeni tekrar False konumuna çekiyor. Sürekli çalışan bir kod yok. Sadece kontrol ediyor. Ama aşağıda verdiğim ekran görüntülerinde 181 sayfa açık ve işlemci kullanımı %50 lerin üzerinde. Bir türlü düşüremedim. Nedeni ne olabilir acaba. Sunucu Özellikleri Windows server 2016 IIS 10.0 8 Çekirdek (Xenon E5-2650 2.3 ghz) işlemci 8 gb ram ServerModule üzerinde çalışan ThreadTimer içerisindeki kod (interval =2000) // TÜM WEB EKRANLARA AİT YENİ ÇAĞRI VARILARI KONTROL ET Q_Yeni_Cagri.Close; Q_Yeni_Cagri.SQL.Clear; Q_Yeni_Cagri.SQL.Add('SELECT * FROM CAGRI_VIEW_WEB WHERE (ISLEM_DURUMU=0) AND (EKRAN_TURU=''WEB'') ' +' AND (CONVERT(datetime,KAYIT_ZAMANI,121)>=CONVERT(datetime,dateadd(SS,-'+CAGRI_KONTROL_SURESI+',getdate()),121))' +' ORDER BY KAYIT_ZAMANI ASC'); Q_Yeni_Cagri.Open; Bilgi:='9'; // YENİ ÇAĞRILAR VAR İSE if Q_Yeni_Cagri.RecordCount>0 then Begin S := UniServerModule.SessionManager.Sessions; // YENİ ÇAĞRI LİSTESİNİ DÖNGÜYE SOK while not Q_Yeni_Cagri.Eof do Begin //UniServerModule.Logger.AddLog('YENİ ÇAĞRI VAR ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: '); // eğer yeni çağrı bulunur ise aktif sessionların listesini al Bilgi:='10'; S.Lock; try Bilgi:='11'; //Aktif_Sessions.Filtered:=false; //Aktif_Sessions.EmptyDataSet; // SESSİON SAYISI KADAR DÖN çağrının ait olduğu sessiona çağrıyı gönder for I := 0 to S.SessionList.Count - 1 do begin Bilgi:='12'; U := S.SessionList[I]; if U.UniMainModule <> nil then if ((U.UniMainModule as TM_Module).EKRAN_ID<>'Close') AND ((U.UniMainModule as TM_Module).EKRAN_ID=Q_Yeni_Cagri.FieldByName('EKRAN_ID').AsString) then Begin Bilgi:='13'; (U.UniMainModule as TM_Module).CAGRI_ID:=Q_Yeni_Cagri.FieldByName('CAGRI_ID').AsInteger ; End ; end; finally Bilgi:='14'+Bilgi; S.Unlock; // ... and finally don't forget to release lock! //UniServerModule.Logger.AddLog('1-Oturum listesi alındı.' ); end; Q_Yeni_Cagri.next; Bilgi:='15'; End; End MainForm üzerinde Çalışan Timer içerisindeki kod (interval=1000) if frm_ana.Height<> UniApplication.ScreenHeight then Begin frm_ana.Height:=UniApplication.ScreenHeight; frm_ana.Width:= UniApplication.ScreenWidth; End; if M_Module.UniCon_Cagri.Connected then begin ImgDB_Var.Visible:=true; ImgDB_Yok.Visible:=false; end else begin ImgDB_Var.Visible:=false; ImgDB_Yok.Visible:=true; end; if TMR_Cagri_Kontrol.Enabled=True then begin Img_Kontrol_Var.Visible:=true; Img_Kontrol_Yok.Visible:=false; end else begin Img_Kontrol_Var.Visible:=false; Img_Kontrol_Yok.Visible:=true; end; // eğer server tarafından gönderilen ÇAĞRI ID EN SON GERÇEKLEŞTİRİLEN ÇAĞRI ID DEN BÜYÜK İSE // YENİ ÇAĞRI VAR DEMEKTİR. YENİ ÇAĞRIYI GERÇEKLEŞTİR. // eğer yan son tru ise bir çağrı gerçekleştiriliyordur. çağrı bitene kadar yeni çağrı yapma if (M_Module.CAGRI_ID> EN_SON_CAGRI_ID) and (Yan_Son=false) then Begin Btn_Veri_AktarClick(self); End; Quote Link to comment Share on other sites More sharing options...
kayhan Posted November 3, 2020 Share Posted November 3, 2020 Örnek görmeden bir şeyler söyleyebilmek zor fakat yer verdiğiniz kodlardan incelediğim kadarıyla bir şey gözüme çarptı; Quote Q_Yeni_Cagri.SQL.Add('SELECT * FROM CAGRI_VIEW_WEB WHERE (ISLEM_DURUMU=0) AND (EKRAN_TURU=''WEB'') ' +' AND (CONVERT(datetime,KAYIT_ZAMANI,121)>=CONVERT(datetime,dateadd(SS,-'+CAGRI_KONTROL_SURESI+',getdate()),121))' +' ORDER BY KAYIT_ZAMANI ASC'); Bu kod ile yeni çağrı var mı yok mu kontrol ediyorsunuz. Diyelim ki yeni bir çağrı var; Yeni çağrı olduğunu anladığınız an, veritabanına evet ben çağrıyı aldım diyecek bir kod yazmamışsınız. Yani veritabanını güncellemediğiniz için her 2 saniye de bir yeni çağrı varmış gibi sistem sonsuz döngüye giriyor. Tüm işlemleri her 2 saniyede tekrar tekrar yaptığı için işlemci kullanımı asla düşmüyor. Dediğim gibi bir bakışta bu gözüme çarptı. Belki de sorun başka yerdedir. Quote Link to comment Share on other sites More sharing options...
İbrahim TELCİ Posted November 6, 2020 Author Share Posted November 6, 2020 On 11/4/2020 at 12:13 AM, kayhan said: Örnek görmeden bir şeyler söyleyebilmek zor fakat yer verdiğiniz kodlardan incelediğim kadarıyla bir şey gözüme çarptı; Bu kod ile yeni çağrı var mı yok mu kontrol ediyorsunuz. Diyelim ki yeni bir çağrı var; Yeni çağrı olduğunu anladığınız an, veritabanına evet ben çağrıyı aldım diyecek bir kod yazmamışsınız. Yani veritabanını güncellemediğiniz için her 2 saniye de bir yeni çağrı varmış gibi sistem sonsuz döngüye giriyor. Tüm işlemleri her 2 saniyede tekrar tekrar yaptığı için işlemci kullanımı asla düşmüyor. Dediğim gibi bir bakışta bu gözüme çarptı. Belki de sorun başka yerdedir. Yeni çağrıyı yakaladığında o çağrı ile ilgili oturuma senin çağrın var diye mesaj gönderiyor. Mesaj giden oturum çağrıyı gösteriyor ve o kaydı kapatıyor. Tekrar sorguyu çalıştırana kadar oturum o çağrıyı sonlandırmış oluyor zaten. Dönüşünüz için teşekkürler. Quote Link to comment Share on other sites More sharing options...
İbrahim TELCİ Posted November 6, 2020 Author Share Posted November 6, 2020 Başka bir önerisi olan yokmu acaba? Ben birşey bulamadım henüz. Quote Link to comment Share on other sites More sharing options...
sinanaydin Posted November 8, 2020 Share Posted November 8, 2020 Timer da ChainMode=True olarak seçtiniz mi ? Quote Link to comment Share on other sites More sharing options...
İbrahim TELCİ Posted November 10, 2020 Author Share Posted November 10, 2020 Hayır ChainMode seçmedim. Bu özellik ne işe yarıyor. Quote Link to comment Share on other sites More sharing options...
sinanaydin Posted November 10, 2020 Share Posted November 10, 2020 örneğin timer 1 saniye de bir çalışıyor, fakat işleminiz bazen 1 saniyeden uzun sürüyorsa chainmod =true yapıldığında işlem bitmeden timer tekrar devreye girmiyor. diğer türlü gecikmelerde üst üste çalıştığı için cpu sorununu yapıyor olabilir. Quote Link to comment Share on other sites More sharing options...
İbrahim TELCİ Posted November 19, 2020 Author Share Posted November 19, 2020 On 11/11/2020 at 2:43 AM, sinanaydin said: örneğin timer 1 saniye de bir çalışıyor fakat bazen 1 saniyeden uzun sürüyorsa chainmod =true yapıldığında işlem bitmeden timer tekrar devreye girmiyor. diğer türlü gecikmelerde üst üste çalıştığı için cpu sorununu yapıyor olabilir. Açıklama için teşekkür ederim... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.