Jump to content

İbrahim TELCİ

uniGUI Subscriber
  • Posts

    35
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by İbrahim TELCİ

  1. Merhabalar; Sürekli kullandığım Tuniwebsocket kompenenti aşağıdaki hatayı veriyor. Unit dosyasını bulamıyor. FMSoft_uniGUI_Professional_1.90.0.1565.exe paketini yeniden kurdum hala aynı. çözemedim. Dosyayıda bulamadım bilgisayarda. Güncelleme yapacaktım projem askıda kaldı. Acil çözüm bekliyorum arkadaşlar. Şimdiden teşekkürler. iyi çalışmalar.

    [dcc32 Fatal Error] Main.pas(21): F2613 Unit 'UniWebSocket' not found.

  2. Merhabalar. Hayır sorunu çözemedim. Normal stanalone olarak çalıştırdım. Üzerine fazla düşemedim. Şimdilik böyle devam ediyorum. Keşke yardımcı olabilseydim. Kullanıcı sayım 200 ü geçmediği için problemim yok. Ama daha üst sayılarda muhakkak çözüm bulmam gerekecek.

  3. İyi günler arkadaşlar. Hyper serverdan standalone bir uygulama yayınlıyorum. Kendi bilgisayarımda testlerde hiçbir sıkıntı yok. Lakin uzak bir sanal makineye yüklediğimde http://***:8090/server sayfası açılıyor. Ama http://***:8090 asıl sayfa açılmıyor. Hatada vermiyor. Herhengibir logda yazmıyor. Açılmıyor.

    hbyperserver değilde Uygulamanın sadece kendisini çalıştırıyorum o zaman çalışıyor... Antivirüs firewall kapalı. runtime paket kurulu 1 gündür uğraşıyorum. Çözüm bulamadım. Yardımcı olursanız sevinirim.

  4. Merhabalar;

    Yazdığım projede aktif olan tüm oturumların listesini "UniServerModule.SessionManager.Sessions" ile alıyorum. Oturumları her seferinde tarayıp ilgili olan oturumlarda bir değişkene değer gönderiyorum. Yalnız bu listeyi sürekli taramak zorunda kalıyorum (2 saniyede bir). Sürekli olarak session.locK ve session.unlock yapmış oluyorum. Bu pek tavsiye edilen bir yöntem değil. Ortalama aktif 300 oturumum var.

    Bunu daha farklı nasıl yapabilirim. Bir tablo yada array içinde oturum bağlandığında kendisini eklese yok olduğunda kendisini silse gibi birşey.

    Tavsiyeleriniz nedir?

  5. Merhabalar;

    MainModule üzerindeki onSessionTimeout olayı tetiklendiğinde kullanıcı hiç bir işlem yapmadan sayfanın yeniden yüklenmesini istiyorum. Ama bir etkileşim olmadan bunu yapamadım.

    Servermodule üzerinde RestartSessionTimeout açık. Timeout olduğunda mevcut oturumun sonlandırılıp yeni bir oturumla sayfanın yeniden yüklenmesini istiyorum. Kullanıcı herhangibir işlem yapmadan bu otomatik gerçekleşecek.

  6. 21 hours ago, Hayri ASLAN said:

    Merhaba

    CustomException demosunu inceleyebilirsiniz.

    C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\CustomException

    (sender as TUniMainModule).Terminate; yapabilirsiniz.

     

    Yanıtınız için teşekkür ederim. Zaten söylediğiniz demo uygulama üzerinden çalışıyorum. Terminate ettiğim zaman sayfa sonlanıyor. Ben sayfayı yeniden başlatmak istiyorum. Bu konu ile alakalı bir çözüm öneriniz var mı?

  7. Merhabalar. SgcWebscoket ile mqtt protokolünü kullanmak istiyorum. Tam bir örnek bulamadım. VCL komponentlerini forma ekleyerek çalıştırabildim. Bağlanıyorum subscrible dinleyip publish mesajlarını alabiliyorum. Yalnız bu seferde kapatırken memory leak hatası veriyor. 

    Basit bir şekilde connect ,Suscrible ve publish adımlarını ufak bir örnekle anlatabilecek yardım talep ediyorum.

    Sgcwebsocket haricinde de mqtt kullanım tavsiyelerine açığım.

    Şimdiden teşekkür ediyorum.

  8. 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... 

     

  9. 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.

  10. 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;

     

    Ekran Görüntüsü (71).png

    Ekran Görüntüsü (72).png

  11. Log dosyasında aşağıdaki hatayı alıyorum nedeni nedir? Normalde belirtilen klasörde dillere göre yerel tarih saat biçimleri var anladığım kadarıyla. Tr yi bulması gerek ama bulamıyor. Windows server 2016 ingilizce işletim sisteminde IIS üzerinden yayınlıyorum. Yalnız tüm dile ve bölgesel ayarlar Türkçe olarak ayarlandı.

    ,File not found: C:\Program Files (x86)\FMSoft\Framework\unigui\ext-7.0.0\build\classic\locale\locale-.js

  12. Merhabalar. projemi 64 bit dll olarak build edip. IIS te yayınlamak istiyorum. Denemelerim başarısız oldu. Formum açılıyor ama veritabanı bağlantısı kuramıyorum. Form üzerindeki nesneler gelmiyor. Geliştirici klavuzundaki yönergelere göre yaptım. 64 bit için farklı bir ayar var mı?

  13. Çok garip bir durum ServerModule üzerinde çalışan bir Threadtimer içinde oturumların listesini alıp veritabanında değişiklik olan oturumlara güncelle diye bir değişkeni tetikliyorum.

    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
    
                    //S.Lock;
                    try
    
                      //Aktif_Sessions.Filtered:=false;
                      //Aktif_Sessions.EmptyDataSet;
                      // SESSİON SAYISI KADAR DÖN TÜM SESSİONLARI DATA SETE AT
                      for I := 0 to S.SessionList.Count - 1  do
                      begin
                        U := S.SessionList[I];
                        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
    
                           (U.UniMainModule as TM_Module).CAGRI_ID:=Q_Yeni_Cagri.FieldByName('CAGRI_ID').AsInteger ;
    
                        End ;
    
                      end;
                    finally
                      //S.Unlock; // ... and finally don't forget to release lock!
                      //UniServerModule.Logger.AddLog('1-Oturum listesi alındı.' );
                    end;
    
    
                    Q_Yeni_Cagri.next;
                 End;

    Bu şekilde timeouta düşen oturumlar kapanıyor.

    Ama yukarıdaki gibi oturumdaki değişkeni

    U:=UniServerModule.GetSession(Aktif_Sessions.FieldByName('SESSION_ID').AsString);
    (U.UniMainModule as TM_Module).CAGRI_ID:=Q_Yeni_Cagri.FieldByName('CAGRI_ID').AsInteger;

    bu şekilde aktarınca. Oturumu "Uniapplication.terminate" yapsam bile sürekli açık kalıyor. Şimdilik böyle çözdüm. İşin aslınıda çözemedim.

×
×
  • Create New...