folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder Selenium'da Takıldığım Asenkron Noktası



Selenium'da Takıldığım Asenkron Noktası

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    GodKlaus
    GodKlaus's avatar
    Kayıt Tarihi: 13/Ocak/2014
    Erkek

    Herkese merhaba. Şu deprem korkusundan uyuyamıyorum bari kod yazayım dedim.

    Hemen konuya giriyorum ve devamında takıldığım yeri soracağım.

     

    Bir web tabanlı oyun için bot yazdım. Hali hazırda çalışıyor istediğim işleri vs yapıyor ancak bir şekilde yakalanıyor mendebur.

    Basit olarak HTML sayfasındaki butonlara falan tıklatıyorum kendi kendisine hareket ediyor ve istediğim şartlar oluşunca bana haber veriyor. Her hareketten(sağ sol yukarı yada aşağı) sonra sayfadaki bir text'i kontrol ediyor ve dediğim gibi istediğim şeyler varsa messagebox ile beni uyarıyor.

     

    Şimdi yapmak istediğim şey şu. Ben kendim sağa sola ileri geriye götüreyim ancak bir şekilde bu uygulama sürekli html'yi kontrol etsin. For döngüsü ile yapamıyorum biliyorsunuz loop sayısı bitmeden bir sonraki işleme geçemiyorum.

    Farklı bir thread oluşturmayı henüz denemedim. Diğer bir thread'da sürekli döner kontrol eder. Bende o sırada karakterimi hareket ettirebilirim.

    Async methodlar varmış. JavaScriptte Discord için bot yazarkende bu ismi duymuştum. Programa onu uyguladım şuanda fakat çalışmıyor. TextBoxları dolduramıyorum ayrıca sadece 1 sefer çalışıyor ve duruyor.

     

    Sorum şu : Ben nasıl bir yol izlemeliyim ki ben karakterimi oynatırken aynı zxamanda uygulama arkada bir servis gibi çalışsın ?

     

    Dil olarak C# kullanıyorum. Herkese teşekkürler (:

     

    Edit: Async'i araştırdım baktım ki sıralı işlemleri tek bir sıra ile aynı anda yapmaya yarayan sistemmiş. Yani benim istediğim şeyi karşılamıyor. Ben GUI donmadan ve aynı zamanda oyunda donmadan bunun üstesinden nasıl gelebilirim ? ?

    GodKlaus tarafından 11/Ara/19 01:42 tarihinde düzenlenmiştir

    Telegram : @CuneytKuscu && Discord : Tyenuc#2679 | İstanbul Avr. Yazılım Mühendisi ve sonunda işim var (:
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Merhaba hocam

    Dogru anladim mi sorunu emin degilim ama cevap vermeye calisayim anladigim kadariyla..

    Yapmak istedigin sey ayni anda birden fazla is yapmak/yaptirmak ve bunu c# ile yapmak..

    Birden fazla yolu var bunu yapmanin, asenkron metodlar olabilir, Task olabilir, paralel programlama olabilir, backgroundservice olabilir, thead/theadpool olabilir vs vs

    Eger bir döngü icerisinde paralel calismasini istiyorsan hic ugrasmadan bu isi Parallel.For ya da Parallel.Foreach ile yapabilirsin. Ancak döngü icerisindekilerin siralmasini kontrol edemezsin.. Yani kontrol elinde cok fazla olmayacak..

    Benim tavsiyem Task ve async leri birlikte kullanman. Senin takildigin nokta ise bunlari sürekli cagirmak-calistirmak.. O halde bir callback gerekecek sana. Yani metodun isi bittiginde sana haber verecek, sen de sonucuna göre o metodu tekrar cagirabilirsin ya da cagirmazsin.

    Bunu da iki yolla yapabilirsin. TaskCompletionSource kullanabilirsin ya da basit bir event handler yazabilirsin. 

    surada cesitli bir kac kod var bunlari inceleyebilirsin https://johnthiriet.com/cancel-asynchronous-operation-in-csharp/ (en altta github linki var, ordan projeyi indirip deneyebilirsin ve sonuclari inceleyebilirsin)

    üstte söylediklerimi arastirarak örnekler bulup anlamaya calis. Anlayamadiklarini tekrar sorabilirsin.

    Kücük bir eklemede bulunayim; c#'da UI elemanlari main thread tarafindan kontrol edilir. Baska bir thread bu elemanlara müdahale etmek isterse iki thread birbiriyle cakisir o zaman da cross-thread exception'i firlatir. Bunu bir kac sekilde önleyebilirsin. Benim tavsiyem Invoke metodunu kullanarak yapman

    Mesela bir textbox'un text degerini degistirmek istiyorsun. Kisaca thread pool ile ilgili örnek yapayim (kodu direk foruma yazdigim icin hatalar olabilir)

    Her hangi bir yerde söyle cagiriyorum

    ThreadPool.QueueUserWorkItem(TextBoxValueDegistir, "Saat gec oldu git uyu artik");
    
    public voidTextBoxValueDegistir(object message)
    {
    
       if(txtMessage.InvokeRequired)
       {
    
          txtMessage.Invoke(()=>txtMessage.Text = message);
    
         // birden fazla satiri var ise metodun icinin;
    
           txtMessage.Invoke(()=>{
    
                                      txtMessage.Text = message.ToString();     
                                       txtMessage.ForeColor = Color.Red;          
                                      });
        }
        else
          txtMessage.Text= message; 
    }

    simdi üstteki metodu threadpool ile cagirinca, InvokeRequired propertysi true olarak deger dönderecek cünkü, txtMessage UI elemeni main thread tarafindan kontrol ediliyor. O yüzden Invoke metoduyla cagrilmasi gerektigi söyleniyor cünkü ben farkli bir thread ile erismeye calisiyorum. Bir cok UI elementinin (form control) Invoke metodu var ve bir delegate ile o kontrolün degerlerini degistirebiliyorsun.. Eger birden fazla satirin varsa (hem metni degistirmek hem rengi degistirmek gibi) o zaman kodu {} arasina yazman gerek..

    yine üstteki metodu bir thread üzerinden degil de normal bir metod üzerinden (yani main thread'in kontrol ettigi bir yerden) 

    TextBoxValueDegistir("Hey dünyali naber!");
    

    o halde bu metod main thread üzerinden cagrildigindan, InvokeRequired false dönecek ve if'in else tarafi calisacak sadece. Cünkü her hangi bir thread cakismasi gerekmiyor o yüzden Invoke ile cagirmaya gerek yok.

    Umarim aciklayici olmustur. 

    kolay gelsin

     

    unbalanced tarafından 11/Ara/19 03:11 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    GodKlaus
    GodKlaus's avatar
    Kayıt Tarihi: 13/Ocak/2014
    Erkek

    Teşekkürler @unbalanced hocam, yapabileceğim farklı yollardan bahsetmiştin. Bende internette Task ve Async birlikte kullanımlarını gördüm uyarladım fakat beceremedim :D

    Yapmak istediğim sürekli sürekli sürekli html'deki bir alanın text'ini kontrol etmek. Eğer orada istediğim isim varsa messagebox.show yapsın ve html sayfasını incelemeyi durdursun.

    2 tane pencere var. 1 tanesi windows formun kendisi. Diğeride Firefox WebDriver.

    Ben WebDriver'dan yön tuşları ile hareket ederken yada etmezken bir fonksiyon linkteki adresin html'sindeki bir başlığı kontrol edecek. Yapmak istediğim bu kısaca.

     

    Link'i inceliyorum şuanda. Olurda becerebilirsem bu projemi kötülük için(öcümü almak için) kullanıcam 😈

     

    Edit : Anlamadığım kısım şu. discord'a bot yaparken mesajları dinleyen fonksiyon sürekli olarak dinleme yapıyor. Yani 1 kez başlatiyorum bitir komutunu verene kadar sürekli dinliyor ve eğer belirli bir komut varsa tepki veriyor.

    Ben bu asenkron sisteminde sürekli çalışmasını nasıl sağlayacağımı anlamadım. 1 kez çalışıyor ve bitiyor. Bunu nasıl aşabilirim ?

     

    GodKlaus tarafından 11/Ara/19 12:37 tarihinde düzenlenmiştir

    Telegram : @CuneytKuscu && Discord : Tyenuc#2679 | İstanbul Avr. Yazılım Mühendisi ve sonunda işim var (:
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    hocam event kullanacaksin iste.. fonskiyonun bitince o eventi tetikle, daha sonra fonksiyonunu tekrar calistir.. Öncelikle söyledigim seyleri ögren, anlamaya calis hocam, sonra zaten kendin yaparsin.

    ögle arasinda örnek bi proje yaparim.


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    GodKlaus
    GodKlaus's avatar
    Kayıt Tarihi: 13/Ocak/2014
    Erkek
    unbalanced bunu yazdı

    hocam event kullanacaksin iste.. fonskiyonun bitince o eventi tetikle, daha sonra fonksiyonunu tekrar calistir.. Öncelikle söyledigim seyleri ögren, anlamaya calis hocam, sonra zaten kendin yaparsin.

    ögle arasinda örnek bi proje yaparim.

    Bir event oluşturdum. Event'e += ile fonksiyonun kendisini ekledim. Yani Button1.Click'teki Click nasıl bir event'se Benim yazdığım da bir event.

    Bu event'i çalıştırdığımda ( butonun içerisinde yapıyorum bunu) kısır döngüye girip GUI donuyor.

     

    Edit : Anladığım şu                                                                                                                                                                                     1. iş                                                   ucuna eklediğim 2. iş

    Halihazırda bir event 1 iş yapıyorsa ben bunun ucuna N tane daha iş ekliyorum. Örnek ( Lavaboyu kullan, ellerini güzelce yıka ) Sabah uyandığımızda lavaboya giriyoruz ve sonrasında ellerimizi yıkıyoruz.

    Ancak tekrar tekrar nasıl yapıyor ben bunu hala anlamadım ben malım dkjjkdsjkdas

    Fonksiyon bittikten sonra event'i tetikliycem şimdi, bakalım nolcak

    GodKlaus tarafından 11/Ara/19 13:53 tarihinde düzenlenmiştir

    Telegram : @CuneytKuscu && Discord : Tyenuc#2679 | İstanbul Avr. Yazılım Mühendisi ve sonunda işim var (:
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    hocam birazdan ögle arasina cikacagim. bi seyler yedikten sonra örnek bi proje yaparim :) o zamana kadar ugrasip cözmeye calis. En iyi ögrenme yolu bu


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    basit bir örnek yaptim hocam

    https://yadi.sk/d/WqhdVw10hEeuRg

    kisaca: http://lorempixel.com/400/200/

    üstteki linkten resmi indiriyor ve formda gösteriyor. Start-Stop butonu ile kontrol edebilirsin.

    Sag tarafinda da add butonuna bastikca kac tane resim indirmis onu listeye ekliyor (arkada islem yaparken, gui'nin kilitlenmeden islem yaptigini göstermek icin ekledim).

    resimler biraz yavas iniyor sanirim siteden kaynakli.. Cabuk cabuk yaptigim icin gözümden kacmis hatalar olabilir.

    Anlamadigin yerleri sorabilirsin kolay gelsin

     

    unbalanced tarafından 11/Ara/19 15:22 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    GodKlaus
    GodKlaus's avatar
    Kayıt Tarihi: 13/Ocak/2014
    Erkek
    unbalanced bunu yazdı

    basit bir örnek yaptim hocam

    https://yadi.sk/d/WqhdVw10hEeuRg

    kisaca: http://lorempixel.com/400/200/

    üstteki linkten resmi indiriyor ve formda gösteriyor. Start-Stop butonu ile kontrol edebilirsin.

    Sag tarafinda da add butonuna bastikca kac tane resim indirmis onu listeye ekliyor (arkada islem yaparken, gui'nin kilitlenmeden islem yaptigini göstermek icin ekledim).

    resimler biraz yavas iniyor sanirim siteden kaynakli.. Cabuk cabuk yaptigim icin gözümden kacmis hatalar olabilir.

    Anlamadigin yerleri sorabilirsin kolay gelsin

     

    Çok teşekkür ederim @unbalanced hocam. Umarım bir gün bende bu şekilde yardımcı olabilecek düzeye gelirim forumdakilere.

    Anlamadığım bir şekilde çalışıyor şuanda pokemon yakalama botum :D Farklı bir classtan neden inheritance yaptık mesela ?

    Gece boyu düzenleme yaparım üzerinde ve harika bir şekil aldıktan sonra da oyunu mikmeye devam.

    Bana çektirdiklerinizi size yaşatıcam yavşak pokemon adminleri !!

     

    GodKlaus tarafından 11/Ara/19 16:49 tarihinde düzenlenmiştir

    Telegram : @CuneytKuscu && Discord : Tyenuc#2679 | İstanbul Avr. Yazılım Mühendisi ve sonunda işim var (:
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Farklı bir classtan neden inheritance yaptık mesela?:

    Class'tan degil Interface'den hocam. Aliskanlik diyelim :) Ilerde kaynak degisirse diye interfaceler üzerinden calisman iyi olur. Kücük projeler icin gerek yok. Onu silebilirsin yine calisacaktir uygulama

     


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    GodKlaus
    GodKlaus's avatar
    Kayıt Tarihi: 13/Ocak/2014
    Erkek
    unbalanced bunu yazdı

    Farklı bir classtan neden inheritance yaptık mesela?:

    Class'tan degil Interface'den hocam. Aliskanlik diyelim :) Ilerde kaynak degisirse diye interfaceler üzerinden calisman iyi olur. Kücük projeler icin gerek yok. Onu silebilirsin yine calisacaktir uygulama

     

    Birde şu sorun var. Sürekli sürekli hızlı bir şekilde veri çektiğinden GUI yine donuyordu. hep fonksiyonu tekrar çağırmasından önce100ms süre ekledim. Şimdi daha rahatladı gibi.


    Telegram : @CuneytKuscu && Discord : Tyenuc#2679 | İstanbul Avr. Yazılım Mühendisi ve sonunda işim var (:
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    aslinda olmamasi lazim hocam, büyük ihtimalle benim yazdigim kodlarda sikinti var ya da islemci/bellegi cok kullandigin icin donuyor olabilir. Normal bir process ise bi sikinti olmamasi gerek. Aslinda olusturdugum class'in instance'ina farkli bir thread ile erismiyorum. Belki onu da farkli bir thread üzerinden cagirmak gerekebilir

    frmmain deki

    imageHandler.DownloadPhoto(); yerine

    seklinde yap hocam

    Task.Run(()=> imageHandler.DownloadPhoto());

    (iki tane var DownloadPhoto)

     

    bu site dandik oldugu icin tam test edemedim hocam, site blokladi sanirim benim ip imi.. dogru dürüst calmisyor.. O yüzden üstte yazdigim seyi bi dene ona göre bak..

    not: islemin cok hizli oluyorsa sleep koymanda sikinti yok. üstte ekledigim sekilde dene

     

     

    unbalanced tarafından 11/Ara/19 17:18 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
Toplam Hit: 5446 Toplam Mesaj: 15
c# thread asenkron asynchron funcs