

Birisi C#'La İlgili Sorularımı Cevaplayabilir Mi? [Multithreading]
-
Şimdi hocalarım.
En basit haliyle şunu yaptırtmak istiyorum.
Bir class'ım olacak.
Class'ıma get:set ile property ekliyorum bunlar güzel.
Bir butonum var buna tıkladığımda şöyle birşey yaptırıyorum.
Classim cl = new Classim();
cl.ozellik = "bişiler";
cl.blabla = "bişiler";
cl.Baslat(); // işte burası önemli
Class'ın kodlarında Baslat şu şekilde
initial void Baslat()
{
WebBrowser wb = new WebBrowser();
//wblerin tanımları falan filan.
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
//burada tüm işlemler bittiğinde olacakları yaptırıyorum.
}
void wb_DocumentCompleted(blabla)
{
//burada işlemlerimi otomatik olarak yaptırıyorum. şöyle ki tıklattırıyorum bikaç yükleme olunca benim belirlediğim int atıyorum 3 olduğunda işlemi bitiriyorum. wb dispose() ediyorum. bikaç .dll komutuyla da session ve cookie sildiriyorum vs. işlem bitiyor.
//sonra tekrar işleme başlatıyorum başlatmadan önce Thread.Sleep(1000) ile birgüzel bekletiyorum ki iyice dinlensin :D (bazen .dll ler gecikiyor bu yüzden bu bekleme işine de çare bulabilirsem iyi olur)
// sonra tekrar Baslat(); ifadesiyle başlatıyorum.
}
Tüm bunlar güzel ama benim isteğim tek seferde bu işlemi 5-10 defa yaptırtmak. Sanıyorum multi threadingle alakalı. C#ta hala acemi ve tepeden düşme olduğumdan sıkıntı çekiyorum.
Bunu en basit haliyle bana öğretebilecek var mı? interntteki kodları denedim hepsinde hata aldım.
Aldığım hatalardan bazıları:
activexli birşey diyor web browser tanımlamasında. STA.threading gibi bi kod var onu koyuyorum bu kez de işlem yapmıyor.
Form1 ile threadler çakıyor gibi bir ifade çıkıyor.
En çok aldığım 2 hata bunlar (tam detayları veremememin sebebi şuan onları silip çalışan projeyi yaptım. deneme şansım yok ama çok lazım olursa baştan hatalar yapabilirim :D tabi bu işi tam olarak güzel birşekilde anlatan çıkarsa daha çok makbul)
Bir türlü kafam basmadı threadinge yapıyorum yapıyorum ama class a dökemiyorum. döksem hata veriyor vs. invoke olayları felan hiç kafam almadı.
-
Classim cl = new Classim();
classim arrayi olsun onun uzerinden ayni anda yapayim tarzinda ise dusuncen problem, cunku web browserlarin cookie'leri bir olacaktir.
bunun icin webRequest ler ile bunu yapman gerekir. o zmn multitread de
Thread t =newThread(newParameterizedThreadStart(myParamObject)); t.Start(myUrl);diyerek bir myParamOBject isimli fonksiona myUrl yi (sen burda classim'i yollarsin) OBJECT olarak alir.
http://stackoverflow.com/a/1195918
-
Hocam webbrowser formun threadinde çalıştığından o iki event de aynı threadde çalışıyor, yeni thread açmana gerek yok. Eğer yüklenmesini beklerken form kitleniyo diye yapiyosan
1000ms delay etmek yerine
while (wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
label1.Text = wb.ReadyState.ToString();
}
Navigate ettikten sonra bu şekilde yüklenmesini bekleyebilirsn.
Yanlız google reklam clickeri yaziyosun gibi geldi, google akıllıdır, birsürü parametre alıyor dikkat et random aralıklarla tıklatman yetmez bissürü sistem ayarını değiştirmen lazım, saat diliminden ekran çözünürlüğüne, renk derinliğinden browser adına kadar herşeyi değiştirmen lazım. -
@Rakkoc hocam sağolasın başka şekilde hallettim lazım olana dursun :)
HolyOne bunu yazdıHocam webbrowser formun threadinde çalıştığından o iki event de aynı threadde çalışıyor, yeni thread açmana gerek yok. Eğer yüklenmesini beklerken form kitleniyo diye yapiyosan
1000ms delay etmek yerine
while (wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
label1.Text = wb.ReadyState.ToString();
}
Navigate ettikten sonra bu şekilde yüklenmesini bekleyebilirsn.
Yanlız google reklam clickeri yaziyosun gibi geldi, google akıllıdır, birsürü parametre alıyor dikkat et random aralıklarla tıklatman yetmez bissürü sistem ayarını değiştirmen lazım, saat diliminden ekran çözünürlüğüne, renk derinliğinden browser adına kadar herşeyi değiştirmen lazım.@HolyOne hocam ben webBrowser kadar sikik bişi görmedim cidden. Barış Yiğit ağbeyle konuştuk falan webClientle yapmama ikna etti. Ben de webClient ile cookieleri alıp sonraki işlemde header'e taktım sessionlar silinmemiş oldu. Google'la uğraşmıyorum da otomatik üyelik felan deneyleri yapıyorum.
Şimdi webclientle dakikada 8 üyelik (ortalama) yapabiliyorum. BackgroundWorker ile multi işleme dökmeyi planlıyorum hayırlısı bakalım :)
Varsa multi işleme dökmek için önerin yapayım. Kaynak sıkıntım yok vdsde çalışıyorum. Dakikada bi 60 tane üyelik olması için çabalıcam :D (proxy falan da kullanıyorum. 15 temmuzdaki kayıt hala silinmemiş)
-
Ha tamam ööle olur, google clicker fln yapacaksan webclient javascript çalıştırmiycağı için yemezdi ama işini görüyorsa tabiki webclient yapcan.
Tek thread de olsa dakikada 8 üyelik çok az. ilk requestte çok bekletiyorsa webclientin proxy=null yapmayı unutma.
Sen istediğini tek fonksiyon haline getir, tüm parametrelerini de tek bi classda topla, tek parametre alsın ondan sonra thread haline getirmesi kolay zaten.
Ama detayına inince multithreading biraz zordur, bence c# daki threadler daha da zor çünkü birçok şeyi arkaplanda işlediğinden win32 application gibi hakim olamıyorsun.
Ben şu yapıyı çok severim,
http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
genelde bunu kullanıyorum fakat komplike bi thread applciation yapmıyorsan daha basit kodlarla da bitirebilirsin işi
-
HolyOne bunu yazdı
Ha tamam ööle olur, google clicker fln yapacaksan webclient javascript çalıştırmiycağı için yemezdi ama işini görüyorsa tabiki webclient yapcan.
Tek thread de olsa dakikada 8 üyelik çok az. ilk requestte çok bekletiyorsa webclientin proxy=null yapmayı unutma.
Sen istediğini tek fonksiyon haline getir, tüm parametrelerini de tek bi classda topla, tek parametre alsın ondan sonra thread haline getirmesi kolay zaten.
Ama detayına inince multithreading biraz zordur, bence c# daki threadler daha da zor çünkü birçok şeyi arkaplanda işlediğinden win32 application gibi hakim olamıyorsun.
Ben şu yapıyı çok severim,
http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
genelde bunu kullanıyorum fakat komplike bi thread applciation yapmıyorsan daha basit kodlarla da bitirebilirsin işi
Komplike olmasın diye backgorundworker deniyordum hocam ama onda sıkıntıya girdim biraz hantal geldi bana bi de sessionları temizlemiyor.
Buarada proxyleri null yapamam yeni proxy oluşturuyorum her seferinde ki patlamasın. Ayrıca öyle yapmazsam zaten güvenlik kodu filan sokar araya.
Hızlandırmam lazım abü dediğin gibi. 8 çok az verdiğin link de harikaya benziyor da benim kafa okadar çalışmıyor şimdilik :D Class haline getiriyim dediğin gibi. Sonra burada tekrar yazarım. İnvoke olayını filan biraz daha anladım
Mesela performclickte hata alırdım hep thread'ta şimdi şöyle hata almıyorum;
private delegate void InvokeButtonTikla();
private void ButtonTikla()
{
if (InvokeRequired)
{
try { Invoke(new InvokeButtonTikla(ButtonTikla)); }
catch { }
return;
}
button1.PerformClick();
}
Bunun gibi bişeyler denicem bakalım
-
her ne yapıyorsan autoit ile daha kolay yapacağını belirteyim
-
Daft bunu yazdı
her ne yapıyorsan autoit ile daha kolay yapacağını belirteyim
Webclientle ilgili örneği var mı hocam? Pek bişi anlamadım çünkü
-
by_Tet bunu yazdıDaft bunu yazdı
her ne yapıyorsan autoit ile daha kolay yapacağını belirteyim
Webclientle ilgili örneği var mı hocam? Pek bişi anlamadım çünkü
ne yapmak istediğini burdan veya pm'den gönder kullanacağın komutları vereyim
veya örneğini göstereyim
-
Daft bunu yazdıby_Tet bunu yazdıDaft bunu yazdı
her ne yapıyorsan autoit ile daha kolay yapacağını belirteyim
Webclientle ilgili örneği var mı hocam? Pek bişi anlamadım çünkü
ne yapmak istediğini burdan veya pm'den gönder kullanacağın komutları vereyim
veya örneğini göstereyim
Buradaya webclient ile bağlanmayı. Bağlandıktan sonra ilk çıktıyı almayı sonra tekrar bağlanıp ikinci çıktıyı almayı. İlk çıktıdaki key ile ikinci çıktıdaki key aynı olacak. Bu işlem sürekli döngü içinde olacak aynı anda atıyorum 10 tane işlem yapılacak.
Bunu istiyorum hocam. Şuan c#la hepsini yaptım bitek aynı anda 10 tane işlem yaptırtmak kaldı. Hangisi basit gelirse ona kaçıyım multi threading illet
-
olayı anlamadım.
bikaç kere browserdan verdiğin linke baktım.
ilk çıktı da dsdsadas -> xxxxxx gibi bir şey yazdı
sonra hep sabit merhaba -> xxxxxxx yazdı