27 Mayıs 2010 Perşembe

Thread - BackgorundWorker - 3

Tekrar merhaba,

Threadlerle ilgili yazmaya başladığımızda BackgroundWorker( BW demek istiyorum..) hakkında bahsetmeye başlamıştık ve biraz geniş konuolduğu içinde buralara kadar geldik sanırım bir kaç örnek daha vermek lazım..
Toplarlamak açısından önceden bahsettiğim bazı kavramlara açıklık getirmek ve son bir küçük kod parçacığı vererek BW konusundan çıkmak istiyorum... başlayalımmı ?

Daha önce bahsettiğim kavramlar

Control.Invoke -> Birden fazla thread çalışırken, başka bir işlem olan form elementleriyle iletişimde kullanılıyor. Eğer kontrolü(Method) invoke ile kullanmazsak
Cross-thread operation not valid: Control '...' accessed from a thread other than the thread it was created on.
hatasıya karşılaşırız...

Dispatcher.Invoke -> Control.Invoke ile aynı işi WPF için yapar.

Gelelim BW ile ilgili diğer noktalara ;

çalıştırmak için 2 işlemi gerçekleştirmek yeterli olabiliyor
1- bir adet bw nesnesi örneği olşturumak ->
static BackgroundWorker bw = new BackgroundWorker();
ve
dowork olayını kullanmak ->
bw.DoWork += bw_DoWork;

static void bw_DoWork (object sender, DoWorkEventArgs e) {
Console.WriteLine (e.Argument);
}
2- RunWorkerAsync metodunu opsiyonel olarak bir object parametresiyle çağırmak.

Benim tavsiyem ise yapılacak işe göre hazrılanmış bir BW nin altsınıfını oluşturmak ve bunu kullanmak.
BW sealed bir sınıf olmadığından ve virtual OnDoWork sunduğundan bu mümkün ve olay tabanlı asenkron çalışma modeline bir örnek teşkil edebilir.
msdn library
Şöyleki ;

public class Client {
public FinancialWorker GetFinancialTotalsBackground (int foo, int bar) {
return new FinancialWorker (foo, bar);
}
}
public class FinancialWorker : BackgroundWorker {
public Dictionary Result;
public volatile int Foo, Bar;

public FinancialWorker() {
WorkerReportsProgress = true;
WorkerSupportsCancellation = true;
}

public FinancialWorker (int foo, int bar) : this() {
this.Foo = foo; this.Bar = bar;
}

protected override void OnDoWork (DoWorkEventArgs e) {
ReportProgress (0, "Çalışıyorum ..");

while (!finished report ) {
if (CancellationPending) {
e.Cancel = true; // iptal gerekliyse bırakalım...
return;
}
Perform another calculation step
ReportProgress (percentCompleteCalc, "buradayım...");
}

ReportProgress (100, "Gerçekleştirildi!");
e.Result = Result = completed report data;
}
}

Sanırım daha faz BW ile ilgili konuşmaya gerek yok. Gördüğünüz üzere İptal Tamamlandı İşlem durumu özellikleri de mevcut..

daha sonra görüşmek üzere
başarılar..
KANPINAR

20 Mayıs 2010 Perşembe

backgroundWorker devam....

Bugün bahsetmeye başladığım c# ta multi threading e devam etmek istiyorum..
Daha önce verdiğim ( Bölüm -1 ) kodun açıklamasından başlayıp
BackgroundWorker sınıfını bitirmek istiyorum...

!! Bahsettiğim notktalar .net framework 3.5 üzerinde test edildi...

Bir WinForm içerisine toolbox tan sürüklenip bırakılan bir BW üzerinde;

Property kısmına girerek

WorkerReportsProgress
-> Worker birim işlemleri rapor etmelimi?
WorkerSuppertsCancellation -> Birim işlemlerinizi bitmeden iptal etme ihtimaliniz varmı ?

alanlarını "true" olarka seçelim


Events kısmına giderek
DoWork -> operasyon başladığında thread içinde yürütülecek iş tanımı
ProgressChanged -> işlem değiştiğinde, bir kısmı bittiğinde vs. çağrılır
RunWorkerCompleted -> iş tamamlandığında, iptalinde veya durduğunda

alanlarına çift tıklayarak hazırlığımızı bitirelim.

[Serializable]
[ComVisible(true)]
!!!(System.EventArgs is the base class for classes containing event data.)
System.Events sınıfından türetilmiş

DoWorkEventArgs
ProgressChangedEventArgs
RunWorkerCompletedEventArgs

Olay argümanları hemen dikkatimizi çekmiştir.Ve incelemenizi hararetle tavsiye ediyorum.

BW ile işlemlerimizi yürütürken gerçekleşen olaylarla ilgili olarak,
karar vermemizi sağlayacak veriler bu argümanlarla gelen olay dataların içerisinde olacak.

gelelim mini bir örneğe..
!!! thread.sleep(0); !!! thread.sleep(1); ;)
Formun üzerine
iki adet button ve bir progressBar ekledim
1. btn_basla
2. btn_iptal
3. progressBar1 -> min 0 max 100

ve aşağıdaki kodları yazdım ...

private void BW_Test_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i += 1) {
// İptal beklentisi varmı ? durmamam emredildimi ?
if (BW_Test.CancellationPending) {
// İptal Verilmişse thread e dur diyelim
e.Cancel = true;
return;
}
// progres bar gösterebilsin diye değeri gönderelim
BW_Test.ReportProgress(i);
// ilemi gözle görebilmemiz için bekleyelim( iş burada yapılıyor farzediyoruz...)
System.Threading.Thread.Sleep(25);
}
e.Result = 100; }
// yapılan işin yürütülmesinde aşama kaydedildi...progres barı değiştirelim

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
progressBar1.Value = e.ProgressPercentage; }

//ilem tamamlandı veya iptal edildiğinde neler yapılacak
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ bstate(); }

//işlemi başlatalım ...
private void btn_basla_Click(object sender, EventArgs e)
{
BW_Test.RunWorkerAsync();
bstate();
}

// butonlarımızı worker ın durumuna göre değiştirelim..
// bir worker a tekrar başla demek hataya sebep verir
// BW_Test.IsBusy ile kontrol etmek mümkün ... Cevap verebilirse tabi :D
private void bstate() {
btn_basla.Enabled = !btn_basla.Enabled;
btn_iptal.Enabled = !btn_iptal.Enabled; }

//işlemi iptal etmek istediğimizde nasıl olacak...
private void btn_iptal_Click(object sender, EventArgs e) {
BW_Test.CancelAsync(); }

Bir görev vermenin en kötü tarafı onu takip etmektir...
düsturundan hareketle biraz daha kişisellesştirmek için
kendimize göre geliştirme şansımız var.

Örnek vermek gerekirse ;
Yapılan işlemlerde hatayla karşılaştığınızda
bu durumu nasıl egale edeceğinizi önceden planlamak zorundasınız yoksa kabusunuz olabilir..

İptal Ettiğiniz işlem başka bir işlem(ler) tetikliyor ise bunları kontrol etmlisiniz

Arka planda çalışan işlemlerin program sonlanması halinde nasıl bir tavır sergileyeceği düşünülmeli.

http://msdn.microsoft.com/en-us/library/hkasytyf.aspx
adresini incelemekte fayda görüyorum.
Üzgünüm yeterince türkçe kaynak yok malesef.

Ayrıca geniş çaplı thread işlemleri gerçekleştirmek itiyorsak
işlem durumları ve olası problemleri incelemek için işletim sistemleri konusunu
iyi çalışmış olmanızı umuyorum ;) ilerleyen yazılarda daha gelişmiş uygulama örnekleri
umarım yapabilirim.

görüşmek üzere
KANPINAR







19 Mayıs 2010 Çarşamba

c# thread ve işletim sistemi sorunsalları ve BackgroundWorker

main i dışına yolculuk ...

Selam,
tabiki burada işletim sistemleri felsefelerini inceleyemeyiz ama modern işletim sistemleri içerisinde c# ve windows ile multi thread nasıl kullanılır bunu küçük bi kaç örnekle açıklayabilriz.

Haydi başlayalım....

Herhangi bir programı çalıştırdığınızda CLR sizin için hali hazırda bir thread oluşturuyor.Yani aslında tüm programlarımız multi threaded ...

[STAThread]
static void Main()
{
...
[STAThread] ;
single-threaded Apartment - apartman yönetimi rejimi adını verdiğim sistem.
mingle , multi ; tek veya birden fazla birim çalıştırabiliyor olabiliyor.

Peki bu STAThread yaptık ne oldu ?
System.Windows.Forms içersindeki tiplerin geneli single-threaded apartment içerisinde çalışmak üzere dizayn edildiğinden dolayı win32 kullanıcı arabirimine ulaşırken karşılaşabileceğimiz olası iki sorunsaldan kurtulmuş olduk

bunlar ;
- kilitlenmenin(crash) önüne geçmiş olduk.
- genel işleyişin dışına çıkmasının önüne geçmiş olduk. darbe yapabilir neme lazım (nede olsa managed kod yazıyoruz değilmi )

Windows Forms ve WPF için BackgroundWorker sınıfını değerlendirmekte fayda var.
Durum bilgisi ve tamamlanma gibi bilgilere ihtiyaç duyulan thread leri gerektiği gibi yapabiliyor ve otomatik olarak gerektiğinde Control.Invoke veya Dispatcher.Invoke çağrılarını yapabiliyor.
Bu kadar bahsetmişken biraz ayrıntılarına girelim;

Worker threadlerde hata yönetimi zaten var yani try/catch lerle gerek kalmaz.
Durum değişikliklerinde/güncellemelerde Form elementlerini güncelleyebilir.
thread-pool kullanır böylece her işlem için tekrar tekrar thread oluşturulmaz.

using System;
using
System.Threading;
using
System.ComponentModel;
class Program {
static BackgroundWorker bw;

static void Main() {
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
    bw.RunWorkerAsync ("Merhaba, birim çalışmaya başladı...");    
    Console.WriteLine ("İptal için birkaç saniye içinde Enter tuşuna basın");
Console.ReadLine();
if (bw.IsBusy) bw.CancelAsync();
Console.ReadLine();
}
  static void bw_DoWork (object sender, DoWorkEventArgs e) {
    for (int i = 0; i <= 100; i += 20) {
if (bw.CancellationPending) {
e.Cancel = true;
return;
}
bw.ReportProgress (i);
Thread.Sleep (1000);
}
e.Result = 123; // RunWorkerCompleted tamamlandığında gönderilecek
}
 
  static void bw_RunWorkerCompleted (object sender,  RunWorkerCompletedEventArgs e) {
    if (e.Cancelled)
Console.WriteLine ("İptal Edildi!");
else if (e.Error != null)
Console.WriteLine ("Birim Hatası : " + e.Error.ToString());
else
Console.WriteLine ("Birim İşlem Tamam - " + e.Result); // DoWork tan gelecek 123 sonucu
}
  static void bw_ProgressChanged (object sender,  ProgressChangedEventArgs e) {
Console.WriteLine ("tamamlanma oranı " + e.ProgressPercentage + "%");
}
}

yukarıdaki kodun açıklamalarını ve kendi thread lerimizi yönetmeyi bi sonraki yazıya bırakıyorum.

görüşmek üzere
KANPINAR


18 Mayıs 2010 Salı

ASP ve Facebook uygulamasının örneği

Classic ASP ve Facebook IFRAME Appliacation
http://apps.facebook.com/doyoumarryme/ bu adresten uygulamanın çalışma şekline ulaiabilirsiniz.

yetki verildiğinde profil bilgilerini, mail adresini, profil fotoğraflarını alabilmek ve arkadaşarını uygulamaya davet etmek gibi özellikler şu an kullanılabilir durumda.

Session management sorunsallarını atlatabilemk amacıyla biraz dolambaçlı yollardan gidilsede uygulamanın sonucu ÇALIŞIR ...

Elbetteki geliştirmenin sonu yok ...

görüşmek dileğiyle
KANPINAR

Classic Asp ( VBScript ) ve Facebook IFRAME uygulaması ve küçük , BÜYÜK sorunsallar

Sorunları çok olsada yapılamaz olmayan uygulama örneğimizi anlatmaya facebook ta uygulama kaydetmenin nasıl yapıldığını bildiğinizi farzederek sonraki işlemlerden anlatmaya başlamak istiyorum.(Uzun cümle konusunda Guinness World Record "Dünya Rekoru" kırma hazırlığı içindeyim bu arada)

evet ilk olarak aşağıdaki sayfaları ziyaret ederek onu hakkında bir alt yapı edinmeye çalışıyoruz.
(Bu arada bu blogger harika alışkanlık olmuş kısayol tuşlarına basma ctrl + S yapıyorum kaydediyorum 1 sn lütfen diyor :) )

1- http://wiki.developers.facebook.com

2- http://forum.developers.facebook.com

3- http://wiki.developers.facebook.com/index.php/Main_Page

4- http://wiki.developers.facebook.com/index.php/User:ASP_%28VBScript%29

son adreste bulunan Facebook Platform Client Libraries altındaki ASP (VBScript) linkiyle ulaşabildiğiniz ve MD5 sınıfını da içeren dosyaları indiriyoruz.

Tebrikler. Büyük bir aşama kaydettiniz !!!

ikinci aşamada uygulama sayfalarımızı hazrılamaya geliyor.
Klasik olarak Merhaba dünya uygulaması olması gereken uygulama yerine merhaba facebook uygulaması yapabilriz...

Neyse
hemen server veya localdeki sunucumuzun kök(root) dizinine (Artık uygulamamızdaki canvas için hangi adresi verdiysek)
"default.asp" -> dosyası oluşturalım,
"facebook" -> klasörü açalım,
"facebook.asp" , "class_md5.asp" -> dosyalarını içerisine atalım

!!! dosyalarımızı atalım dikkat edelim include ederken md5 dosyasının adı doğru olsun ...

kök klasörübn içersindeki default.asp nin içeriğini aşağıdaki gibi düzenlediğimizde nerdeyse sonuca varmışız demektir.Geriye denemek geliştirmek kalıyor.

!!! bazı boşlukları bu sayfada yayınlama sorunları yüzünden koymak zorunda kaldım lütfen ~ işaretli yerleri silin

<~!--#include file="facebook/facebook.asp" -->

< %
Function GetXmlProperty(x, prop)
for each j in x.documentElement.childNodes
for each i in j.childNodes
If i.nodename = prop Then
GetXmlProperty = i.text
End If
next
next
End Functin
set~oFB = new FaceBook
oFB~.ApiKey = "API"
oFB~.SecretKey = "SECRET"
set~fbQ = oFB.FQLQuery("Select pic from user where uid = '" & oFB.UserId &"'")
resim = GetXmlProperty(fbQ, "pic")
%>
<~img src= "<%=resim%>"/>


yukarıdaki mini uygulama facebook iframe içerisinde çalıştığında sayfayı açan facebook kullanıcısının profil fotoğrasını görüntüler.

FBQL yi araştırırsınız gerekli permission larınız olduğunda kullanıcı ve daha birçok facebok tablolarındaki alanları ve hangi yertkilerle hangilerinmiz eldeedebileceğinizi görebilrisiniz.

!!! daha geniş bir proje hazırlığındaysanız yani hazırda olan asp yerine başka bir uygulama şansınız varsa php yada .net kullanmanızı tavsiye ederim. Çünkü session management la ilgili   problemle karlşılaşmanız olası ve tecrübe edilmiştir.

görüşmek dileğiyle
KANPINAR

14 Mayıs 2010 Cuma

Tutku

Herseyin üstesinden gelebilecek bir kac şey var.
Bunlardan birisi de tutku dur.
Ve Hepimizde mevcuttur.

KANPINAR

13 Mayıs 2010 Perşembe

ipler kuklarlar gerçekler sorular ?

Esastan yasa larda değişiklik kimlerin kukla olduğunu değiştirebilecek kadar etkili olabiliyormu yoksa sadece bunlar bay kal orda kalın yatağıylamı ilgili ?
soru bu...

Kökten değişikliklerin gruplar içindeki çekişmelerin ve sürtüşmelerin ateşini yükseltebileceği gibi taşların yerinden oynamasına sebep olabilrmi ?

Bence evet.. zaman ne gösterecek bakalım ...

Durduk yere seçim çalışmalarına başlamadan önce bu olayları açıklamak ne kadar kolaysa o kadar zor ...

6 Mayıs 2010 Perşembe

Facebook uygulamaları ve sizi dertten kurtarabilecek pratikler

Facebook uygulamlaarı gün geçtikçe yaygınlaşmaya başlarken, diğer taraftanda facebook yerini sağlamlaştırma ve kullanıcılara sunduğu hizmetleri arttırma internette 1 numara olma yaolunda ilerliyor.

Durum böyle olunca facebook kullanıcı veritabanından ve ziyaretçilerinde istifade etmek gibi bir kolaylıktan istifade etmek isteyenler facebook uygulamlarına yönelebiliyor.

Facebook uygulaması denildiğinde iki tür uygulamadan bahsetmek gerek;

1- FBML Application(Facebook İşaretleme Dili Uygulaması türü)
2- IFRAME Application (Faceboook içinde IFRAME yoluyla görüntülenen uygulama türü)

bir üçüncü tür olarak
Facebook Connect Site uygulamasını sayabiliriz.
Facebook Connect ile kullanıcıların tekrar kullanıcı adı şifre yazmak email doğrulaması yapmak yerine facebook taki bilgileri ışığında sitenizi kullanmalarını sağlamış olabiliyorsunuz.

her iki uygulamanında kendine göre avantaj ve dez avantajları var.

* ilk tavsiye daha önceden hazır uygulamanızı facebook ta yayınlama istiyorsanız IFRAME uygulama seçmenizi tavsiye ederim.

Her iki uygulama tipindede facebook kullanıcılarına erişebilmek için kullanmanız gereken Kütüphaneler için ;
http://wiki.developers.facebook.com/index.php/User:Client_Libraries
adresine gözatabilirsiniz.

Her iki uygulama tipinde de facebook uygulama kaydınız olması gerekli.

http://www.facebook.com/developers/apps.php

adresini ziyaret ederek kendi uygulamanızı oluşturmanız gerekli.


1- FBML uygulaması.
FBML uygulamlarında bildiğimiz html tagları yanında facebookun kendi fbml taglarını da kullanmak mümkün bununla ilgili ayrıntılı bilgiyi facebookun developer forumlarında bulabilirsiniz.

2- IFRAME uygulaması.
Hali hazırda bulunan web sitenizi facebook içerisinde çalıştırmak istiyorsanız bu tipi seçmenizde fayda var ayrıca jacascipt kodlarınıda FBML uygulamanın aksine dilediğiniz gibi kullanabilirsiniz.