17 Mart 2009 Salı

Görüntü İşleme (C#)

Görüntü İşleme (C#): "Görüntü İşleme : Ölçülmüş veya kaydedilmiş olan elektronik (dijital) görüntü verilerini, elektronik ortamda (bilgisayar ve yazılımlar yardımı ile) amaca uygun şekilde değiştirmeye yönelik olarak yapılan bilgisayar çalışması.
Bir görüntü gözek(pixel)lerden, gözeklerde kırmızı(R)-yeşil(G)-mavi(B) renk değerlerinden oluşur. Gözeklerin rengi RGB olarak üç ana rengin birleşimi şeklinde ifade edilir. R-G-B renk değerleri 0 ila 255 arasında değişir. 0 en koyu ton iken 255 e gittikçe açılır. Örneğin mavi rengin değeri :(0,0,255) kırmızın :(255,0,0) ve yeşilin de :(0,255,0) dir. Diğer renkler bu değerlerin değişmesi ile elde edilir. Artı olarak 32bitlik bir görüntünün gözekleri 4 kısından oluşur ve 4 kısımda görüntüye saydamlık derecesini veren 'Alpha' kanalıdır.

Görüntünün bir satırda bulundurduğu gözeklerin sayısı o görüntünün genişliğini(width), satır sayısıda o resmin boyunu(height) verir.Boyutlarda (800x600), (1024x768) gibi iki değerli şeklinde yazılır. Bu değerlerden ilki görüntünün genişliğini, ikinci değer ise boyunu verir.

C# ile görüntü işlemek için bir çok yöntem mevcut olmasına rağmen daha hızlı bir yöntem olduğu için pointer kullanacağım. Kullandığım yöntemin ana kalıbı aşağıdaki gibidir.

24bitlik format için ;

public Bitmap griton(Bitmap resim)
{
unsafe
{
BitmapData bmpdata = resim.LockBits(new Rectangle(0, 0, resim.Width, resim.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

byte* p = (byte*)bmpdata.Scan0;
int atıl = bmpdata.Width*3 - bmpdata.Stride;

for (int i = 0; i < bmpdata.Height; i++)
{
for (int h = 0; h < bmpdata.Width; h++)
{
byte ort = Convert.ToByte((p[0] + p[1] + p[2]) / 3);
p[0] = p[1] = p[2] = ort;
p += 3;
}
p += atıl;
}

resim.UnlockBits(bmpdata);

return resim;
}
}

32bitlik format için ;

public Bitmap griton(Bitmap resim)
{
unsafe
{
BitmapData bmpdata = resim.LockBits(new Rectangle(0, 0, resim.Width, resim.Height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

byte* p = (byte*)bmpdata.Scan0;

for (int i = 0; i < bmpdata.Height; i++)
{
for (int h = 0; h < bmpdata.Width; h++)
{
byte ort = Convert.ToByte((p[0] + p[1] + p[2]) / 3);
p[0] = p[1] = p[2] = ort;
p += 4;
}
}

resim.UnlockBits(bmpdata);

return resim;
}
}

Dikkat ettiyseniz 24bitlik formatın aksine burada atıl oluşmamaktadır.

Kodları unsafe bloğunun içinde yazabileceğimiz gibi metodu aşağıdaki gibi de tanımlayabiliriz.

public unsafe Bitmap griton(Bitmap resim)
{
BitmapData bmpdata ...
....
}

Yukarıdaki kodları satır satır açıklarsak;

İlk olarak pointerlar olarak çalışacağımız için kodları 'unsafe' bloğu içinde yazmalıyız veya metodu tanımlarken 'unsafe' özlelliğini kullanmalıyız. Yalnız projemizde unsafe komutunu kullanabilmemiz için öncelikli olarak projenin ayarlarından unsafe kullanımına izin vermeliyiz. Bunun için, 'Project' menüsünden, '[Proje ismi] Properties', açılan pencerede 'Build' seçeneğine girip 'Allow unsafe code' seçeneğini aktif hale getiriyoruz.

BitmapData bmpdata = resim.LockBits(new Rectangle(0, 0, resim.Width, resim.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

Resmin bitlerini ramde kitleyerek üzerinde işlem yapabilceğimiz hale getiriyor. Aldığı parametreler ;

'new Rectangle(0, 0, resim.Width, resim.Height) ' , resmin üzerinde işlem yapılacak alanı belirtir. Yazıldığı şekilde, resmin (0,0) noktasında sonuna kadar tüm alanı kullanır.

'ImageLockMode.ReadWrite' , kilitli alan üzerinde işlem izni. '.ReadWrite' hem okumaya hem yazmaya, '.ReadOnly' adından da anlaşılacağı gibi sadece okurken, '.WriteOnly' sadece yazmaya izin verir.

'PixelFormat.Format24bppRgb' kilitli alanın kullanacağı formatı belirtir.Genel olarak '.Format32bppArgb' ve '.Format24bppRgb formatları kullanılmaktadır. 32 bit formatın 24 formata göre farkı, bir gözekin 3 (r-g-b) yerine 4 (r-g-b-a) parçası olması.

byte* p = (byte*)bmpdata.Scan0;



Ram üzerinde bir gözek ilerlemek.

Bu komut ile kilitli bellek alanının ilk noktasına ulaşılmaktadır. p=p[0] ilk noktayı verirken p[1] bir sonraki vermektedir. Eğer p yi bir artırırsak p[0] artık 2. noktayı verirken p[1] 3. noktayı verir. Gözeklerin renk değerlerine ulaşmak için, eğer p değeri gözeğin başındaysa p[0] o gözeğin mavi(b), p[1] yeşil(g) ve p[3] de kırmızı(r) bileşenini vermektedir. Dikkat ettiysenin dizilimler standart r-g-b diziliminin tersine bellekte b-g-r (mavi-yeşil-kırmızı) şeklinde dizilmiştir. Eğer 32bit formatını seçtiysenin, p[3] değeri bize o gözekin saydamlık derecesini verir. Tam görünür bir gözek için bu değer255 , hiç görünmemesi içinde bu değer 0'a ayarlanır.

Görüntü üzerinde gözek gözek yapılacak (noktasal) işlemler için (parlaklık, gri ton, negatif gibi) tüm gözekleri dolaşacak şekilde içiçe iki döngü yapıyoruz. İçteki döngü bir satırın tüm gözeklerini dolaşırken, dıştaki döngü hangi satırda olduğumuzu belirliyor. Satır içinde dolaştığımız için bir gözekle işimiz bittiğinde bir sonraki gözeke geçmek için iç döngüde p'yi 3 artırıyoruz(32bit te 4). Bir satır bittiğinde de dıştaki döngünün sonunda p'ye atılı ekliyoruz(sadece 24bit için).

resim.UnlockBits(bmpdata);


Burada ise daha önce ram üzerinde kilitleyip üzerinde işlemler yaptığımız bellek alanını resme geri atıyoruz.

Burada anlatılanları uygulamak için ufak bir uygulama ve çeşitli Gİ örnekleri Kod Kütüphanesinde yayınlanacaktır...."
kaynak :http://www.farukterzioglu.com

Alıntı :WMI & System.Management I

WMI & System.Management I: "Merhabalar

Bu makalemde WMI mimarisi, classları ve System.Management Namespace'ini inceleyeceğiz.

İşletim sistemimizde çalışan uygulamalar, servisler gibi bileşenler hakkında bilgi edinmek, yönetimlerini sağlamak, çalışmaları sırasında ortaya çıkan hataları veya perfomans problemlerini gözlemlemek ve bu hataların / problemlerin nedenlerine ulaşmak gereksinimi ile karşılaştığımızda Window Management Instrumentation (WMI) mimarisini kullanarak biraz önce bahsedilen işlemleri ve daha fazlasını kendi geliştirdiğimiz uygulamalar sayesinde kolayca yapabiliriz. WMI bütün Windows tabanlı uygulamalarda özellikle yönetimsel işlemlerin yapılmasında kullanılabilir.

WMI mimarisi üç adet katmandan oluşur. Bunlardan ilki olan Client, WMI kullanarak uygulamanın işleyişi hakkında bilgi toplama, uygulamaları konfigüre etme gibi işlemler yapan uygulamalardır. İkinci katman olan Object Manager katmanı ise Client ve Provider arasında köprü vazifesi gören ve WMI işlemlerinin gerçekleşmesi için servisler sunan katmandır. Son katman olan Provider katmanı ise Client uygulamalara veri sağlayan, Client'lar tarafından çağırılan metodları invoke eden katmandır. WMI Mimarisi daha detaylı olarak aşağıdaki şemadan incelenebilir.



.NET ile uygulamalarımızda WMI işlemlerini gerçekleştirdiğimiz namespace System.Management namespace'idir. System.Management namespace'inin ManagementObjectSearcher nesnesi ile uygulamamızda işimizi görecek olan ilgili ManagementObject'leri elde edebiliriz. ManagementObject'ler object-oriented yapıdadırlar ve içlerindeki her bir class ilgili ManagementObject'in property ve metodlarını taşır. Uygulama geliştiriciler de ellerindeki ManagementObject nesnesi ile uygulama geliştirdikleri sistemlerde istedikleri işlemleri gerçekleştirebilirler.

WMI'da elde etmek istediğimiz verileri query'ler yardımıyla select sorgularında çekebiliriz. Bu select sorgularında ise where clause'ını kullanarak bizim ilgilendiğimiz, daha spesifik verileri de alabiliriz. Örneğin aşağıdaki kod bilgisayarda kurulu olan servislerden startup type'ları automatic olanları getirir:

SELECT * FROM Win32_Service WHERE StartMode = 'Auto'

WMI Win32_Service gibi birçok class'a sahiptir. Ben bu makalemde bu class'lardan bazılarını açıklayarak sahip oldukları property'ler hakkında bilgi vereceğim ve ardından WMI ile bazı sistem, uygulama bilgilerine nasıl ulaşabileceğimize, tüm VMI Classları için sahip olunan özelliklerin nasıl eldeedilebileceğine dair örnek uygulamalar yapacağım.

I)Win32_ComputerSystem

Bir Windows İşletim Sistemi çalışan bilgisayar hakkındaki bilgileri barındırır.

Açıklamalar.
AutomaticResetBootOption(Boolean) Makinanın bir sistem hatasından sonra kendini yeniden başlatıp başlatmayacağı bilgisinin tutulduğu property'dir.
AutomaticResetCapability(Boolean) Otomatik olarak yeniden başlatma özelliğinin makine ile uyumlu olup olmadığı bilgisinin tutulduğu property'dir.
BootOptionOnLimit(UInt16) Reset limiti aşıldığında sistemin davranışını belirtir.
BootOptionOnWatchDog(UInt16) watchdog timer çalıştırktan sonra gerçekleşen boot işleminin tipinin tutulduğu property'dir.
BootROMSupported(Boolean) Boot ROM desteklenip desteklenmediği bilgisinin tutulduğu property'dir.
BootupState(String) Sistemin nasıl başlatıldığı bilgisinin tutulduğu property'dir.
Caption(String) Bilgisayar adının tutulduğu property'dir.
ChassisBootupState(UInt16) Kasanın açılma şeklinin belirtildiği property'dir.
CreationClassName(String) Mevcut VMI Class'ının belirtildiği propertydir. Bu propertyden alt propertylere tekrar ulaşılabilir.

CurrentTimeZone(SInt16) Bilgisayar sisteminin saatinin Coordinated Universal Time saati ile dakika cinsinden karşılaştırıldığı property'dir
DaylightInEffect(Boolean) Daylight saving özelliğinin aktif olup olmadığının bilgisinin tutulduğu property'dir.
Description(String) Sistemin açıklamasının tutulduğu property'dir.
DNSHostName(String) Bilgisayarın DNS host name'inin tutulduğu property'dir.
Domain(String) Bilgisayarın dahil olduğu domain adının tutulduğu property'dir.
DomainRole(UInt16) Bilgisayarın atanmış olduğu domain-workgroup içindeki rolünün tutulduğu property'dir.
EnableDaylightSavingsTime(Boolean) Gün Işığından Faydalanma özelliğinin makina tarafından tanınıp tanınmadığı bilgisinin tutulduğu property'dir.
FrontPanelResetStatus(UInt16) Makina üstündeki reset butonunun güvenlik özelliklerinin set edildiği property'dir.
InfraredSupported(Boolean) Makinada infrared port olup olmadığı bilgisinin tutulduğu property'dir.
InstallDate(DateTime) Bilgisayarın kurulumunun yapıldığı tarih bilgisinin tutulduğu property'dir.
KeyboardPasswordStatus(UInt16) Keyboard Password Status donanım güvenlik ayarlarının tutulduğu property'dir.
LastLoadInfo(String) İşletim sistemi son başlatıldığı zamanki load device veya boot service verilerine ait bilgileri tutar.
Manufacturer(String) Bilgisayar üreticisinin adının tutulduğu property'dir.
Model(String) Bilgisayarın model bilgisinin tutulduğu property'dir.
Name(String) Makina adının tutulduğu property'dir.
NetworkServerModeEnabled(Boolean) Network Server Mode'unun aktif olup olmadığı bilgisinin tutulduğu property'dir.
NumberOfProcessors(UInt32) Makinada mevcut olan işlemci sayısı bilgisinin tutulduğu property'dir.
OEMLogoBitmap(UInt8) OEM tarafından oluşturulan bitmap dosyanın verisini taşıyan array'dir.
OEMStringArray(String) OEM tarafından tanımlanmış olan bazı özelliklerin tutulduğu array'dir.
PartOfDomain(Boolean) Bilgisayarın bir domain'ine dahil olup olmadığı bilgisinin tutulduğu property'dir.
PauseAfterReset(SInt64) Bir reboot başlatılmadan önceki gecikme zamanı bilgisinin tutulduğu property'dir. Değeri -1 ise bekleme süresi bilinmiyor demektir.
PowerManagementCapabilities(UInt16)

Bilgisayarın ve işletim sisteminin güç yönetimi ile ilgili özelliklerinin tutulduğu property’dir. Aldığı değerlerin açıklamaları aşağıdaki gibidir:
0 – Bilinmiyor
1 – Desteklenmiyor.
2 – Etkin değil
3 – Güç yönetimi özellikleri etkinleştirilmiş fakat hangi özelliğin etkin olduğu veya özellik hakkındaki bilgi mevcut değil.
4 – Cihazın güç durumunu kullanıma göre değiştirebileceğini belirtir. (Power State Settable)
5 – SetPowerState metodunun desteklendiğini belirtir. (Power Cycling Supported)
6 – SetPowerState metodunun PowerState değişkeni 5 olarak set edilerek invoke edilebileceğini belirtir. (Timed Power On Supported)
7 - SetPowerState metodunun PowerState değişkeni 5 olarak set edilerek ve Time parametresinin de spesifik bir tarih ve zamana veya zaman aralığına set edilerek invoke edilebileceğini belirtir.
PowerManagementSupported(Boolean)

Cihazda güç yönetimi yapılıp yapılamayacağının tutulduğu boolean property’dir. Bu property güç yönetimi özelliklerinin etkinleştirimiş olup olmadığını belirtmez. Bu bilgi için PowerManagementCapabilities array’indeki öğelere bakılabilir.
PowerOnPasswordStatus(UInt16) Sistem bütününde bulunan Power-On Password ayarı durumunu belirtir.
PowerState(UInt16)

Bilgisayarın ve işletim sisteminin güç durumunu tanımlayan property’dir. Aldığı değerlerin açıklamaları aşağıdaki gibidir:
4 – (Unknown) Bilgisayarın power save modunda olduğu biliniyor fakat bu moddaki kesin durumu bilinmiyor.
2 – (Low Power Mode) Bilgisayar power state modunda fakat hala çalışıyor ve performans düşüşü gösterebilir.
3 – (Standby) Bilgisayar çalışmıyor fakat kısa sürede çalışır hale getirilebilir.
7 – (Warning) Bilgisayar uyarı modunda aynı zamanda power save modunda.
PowerSupplyState(UInt16) Sistem son boot edildiğindeki power supply durumunun belirtildiği propertydir.
PrimaryOwnerContact(String) Bilgisayarın sahibinin erişim bilgilerinin tutulduğu property'dir.
PrimaryOwnerName(String) Bilgisayar sahibinin adının tutulduğu property'dir.
ResetCapability(UInt16) Etkin ise (value=4) donanımsal olarak reset imkanı var demektir. (güç ve reset düğmeleri mevcuttur). Etkin değilse (value=3) reset düğmesi mevcut değildir. Property'nin alabileceği diğer değerler ise 5-Uygulanmamış, 1-Diğer, 2-Bilinmiyor
ResetCount(SInt16) Kullanıcının son reset attığından beri atılan otomatik reset sayısının tutulduğu property'dir. Değer -1 ise bilinmiyor demektir.
ResetLimit(SInt16) Birbirini takip eden kaç reset girişimi olabileceğinin tutulduğu property'dir. Değer -1 ise limit bilinmiyor demektir.
Roles(String) Çalışma ortamında sistemin sahip olduğu rollerin taşındığı property'dir. Örneğin bir network sisteminde property 'Switch' veya 'Bridge' değerlerini taşıyor olabilir.
Status(String)

Cihazın o anki durumunun tutulduğu property’dir. İşlevsel ve işlevsel olmayan birçok durum tanımlanabilir. İşlevsel disk durumları “OK” (Çalışıyor), “Degraded” (Bozulmuş) ve “Pred Fail”’dir. “Pred Fail” cihazın düzgün çalıştığını ancak yakın zamanda bir hata alınabilir olduğunu belirtir. İşlevsel olmayan durumlar ise “Error” (Hata), “Starting” (Başlatılıyor), “Stopping” (Durduruluyor) ve “Service”’dir. Disk service durumundaysa diskle ilgili yönetimsel bazı işlemler yapılıyor anlamına gelir.
SupportContactDescription(String) Destek için kontak bilgisinin tutulduğu property'dir.
SystemStartupDelay(UInt16) İşletim sisteminin başlamadan önceki gecikme zamanının tutulduğu property'dir.
SystemStartupOptions(String) Bilgisayarı başlatma seçeneklerinin tutulduğu property'dir.
SystemStartupSetting(UInt8) Varsayılan bilgisayarı başlatma profilinin tutulduğu property'dir.
SystemType(String) Bilgisayarda çalışan sistemin tipinin tutulduğu property'dir.
ThermalState(UInt16) Bilgisayarın en son açıldığı zamanki termik durumunun tutulduğu property'dir.
TotalPhysicalMemory(UInt64) Toplam fiziksel belleğin tutulduğu property'dir.
UserName(String) Oturum açmış mevcut kullanıcının kullanıcı adının tutulduğu property'dir.
WakeUpType(UInt16) Sistemin açılışına sebep olan event'in tutulduğu property'dir.
Workgroup(String) Workgroup'un adının tutulduğu property'dir.

II)Win32_DiskDrive

Bir Windows İşletim Sistemi çalışan bilgisayar'ın üzerinde bulunan ve işletim sistemi tarafından tanınan fiziksel diskler hakkındaki bilgileri barındırır.

Açıklamalar.
Availability(UInt16) Diskin durumunun ve kullanılırlığının taşındığı property'dir. Örneğin bu property'nin değeri 3 ise cihaz çalışıyor demektir. 4 ise uyarı, 5 ise test, 10 ise bozulmuş, 13, 14, 15 ve 17 ise değişik şekillerde power save modunda demektir. Bu 3 moddan 13 ('Power Save - Unknown') cihazın power save modunda olduğuna işaret eder ancak cihazın durumunun tam olarak bilinmediğini belirtir. 14 ise ('Power Save - Low Power Mode') cihazın yine power save modunda olduğunu fakat düşük performansta da olsa çalıştığını belirtir. 15 ('Power Save - Standby'), cihazın çalışır durumda olmadığını fakat hızlıca çalışır duruma getirilebileceğini belirtir. Son olarak 17 ('Power Save - Warning') ise cihazın pover save modunda olduğunu ve uyarı verdiğini belirtir.
BytesPerSector(UInt32) BytesPerSector property'si diskin her sektöründeki byte sayısını verir.
CapabilityDescriptions(String) Capabilities array'indeki her öğenin detaylı açıklamasının tutulduğu property'dir. Bu array'de tutulan her açıklama Capabilities array'indeki aynı index'te bulunan öğelerle ilişkilidir ve bu öğelerin açıklamasıdır.
Caption(String) Nesnenin kısa bir açıklamasının tutulduğu property'dir.
CompressionMethod(String) Cihazın sıkıştırma algoritmasını veya aracının set edildiği string tipinde property'dir. Cihaz ile sıkıştırma yapmak mümkün değilse veya bu property set edilmek istenmiyorsa (örneğin cihazın sıkıştırma destekleyip desteklemediği bilinmediği için) 'Unknown', cihazın sıkıştırma işlemini desteklediğini fakat sıkıştırma şeklinin bilinmediğini belirtmek için 'Compressed' ve cihazın sıkıştırma işlemlerini desteklemediğini belirtmek için ise 'Not Compressed' şeklinde bu property set edilebilir.
ConfigManagerErrorCode(UInt32)

Win 32 Configuration Manager hata kodunu verir. Aşağıda değerleri ve anlamları listelenmiştir:
0 - Cihaz düzgün çalışıyor.
1 - Cihaz düzgün bir şekilde ayarlanmamış.
2 - Windows bu cihaz için sürücüyü yükleyemiyor.
3 - Cihazın sürücüsü bozulmuş veya sistem bellek veya diğer kaynaklar açısından yetersiz durumda.
4 - Cihaz düzgün çalışmıyor. Sürücülerinden biri veya registry değerleri bozulmuş olabilir.
5 - Bu cihazın sürücüsü Windows'un yönetmediği veya kullanmadığı bir kaynağa ihtiyaç duyuyor.
6 - Cihazın boot ayarları diğer başka cihazlarla çakışıyor.
7 - Filtreleme yapılamıyor.
8 - Cihazın sürücü yükleyicisi bulunamıyor.
9 - Cihaz düzgün çalışmıyor çünkü cihazı kontrol eden firmware cihazın kaynaklarını hatalı belirliyor.
10 - Cihaz başlatılamıyor.
11 - Cihaz başarısız oldu.
12 - Cihazın kullanabileceği yeterli serbest kaynaklar bulunamıyor.
13 - Windows cihazın kaynaklarını doğrulayamıyor.
14 - Cihaz bilgisayar yeniden başlatılana kadar düzgün çalışmayacak.
15 - Cihaz olası bir re-enumeration problemi yüzünden düzgün çalışmıyor.
16 – Windows bu cihazın kullandığı bütün kaynakları doğrulayamıyor.
17 – Cihaz bilinmeyen bir kaynak türü istiyor.
18 – Cihazın sürücülerinin yeniden yüklenmesi gerekiyor.
19 – Registry değerleri bozulmuş olabilir.
20 – VXD Loader’ı kullanırken hata.
21 – Sistem Hatası: Cihazın sürücüsünü değiştirmeyi deneyin.
22 – Cihaz devre dışı bırakılmış.
23 - Sistem Hatası: Cihazın sürücüsünü değiştirmeyi deneyin. İşe yaramazsa cihazın dökümantasyonuna başvurun.
24 – Cihaz mevcut değil, düzgün çalışmıyor veya tüm sürücüleri yüklenmemiş.
25 – Windows hala cihazın kurulumunu yapıyor.
26 – Windows hala cihazın kurulumunu yapıyor.
27 – Cihaz geçerli bir log konfigürasyonuna sahip değil.
28 – Cihazın sürücüleri yüklü değil.
29 – Cihaz etkin değil çünkü cihazın firmware’i cihaza gerekli kaynakları sağlamadı.
30 – Cihaz başka bir cihazın kullandığı Interrupt Request (IRQ) kullanıyor.
31 – Cihaz düzgün çalışmıyor çünkü Windows cihaza gerekli sürücüleri yükleyemiyor.
ConfigManagerUserConfig(Boolean)

Cihazın kullanıcı tarafından belirlenmiş bir konfigürasyona sahip olup olmadığını belirtir.
DefaultBlockSize(UInt64) Bu birim için varsayılan blok boyutunu verir.
Description(String)

Nesnenin açıklamasının tutulduğu property’dir.
DeviceID(String)

Diskin sistemdeki diğer cihazlardan ayrıştırılmasını sağlayan sahip olduğu benzersiz string tipinde ID property’sidir.
ErrorCleared(Boolean)

LastErrorCode property’sinde belirtilmiş olan hatanın temizlenmiş olup olmadığının tutulduğu property’dir.
ErrorDescription(String)

LastErrorCode property’sinde belirtilmiş olan hata ve düzeltmek için yapılabilecekler hakkında daha fazla bilgi sağlayan string tipinde property’dir.
ErrorMethodology(String)

Cihaz tarafından desteklenen hata belirleme ve düzeltme tipleri hakkında açıklamaların tutulduğu property’dir.
Index(UInt32) Index property’si ilgili sürücünün fiziksel sürücü numarasını verir. Bu öğe Get Drive Map Info tarafından doldurulur.
InstallDate(DateTime)

InstallDate property’si cihazın kurulduğu tarihi tutar. Bu değerin olmaması cihazın kurulmadığı anlamına gelmez.
InterfaceType(String)

Diskin arabirim tipinin taşındığı property’dir. Örneğin SCSI
LastErrorCode(UInt32) Cihaz tarafından verilen en son hatanın tutulduğu property'dir.
Manufacturer(String) Diskin üreticisinin adının tutulduğu property'dir.
MaxBlockSize(UInt64) Bu cihaz için kullanılabilecek maksimum blok boyutu byte cinsinden verilir.
MaxMediaSize(UInt64)

Cihaz tarafından desteklenen kb cinsinden maksimum medya boyutunun tutulduğu property’dir. Kb 1 byte’ın 1000 ile çarpımından elde edilen sayıdır, 1024 ile çarpımından elde edilen sayı değildir.
MediaLoaded(Boolean) MediaLoaded özelliği disk sürücüsünde bir media olup olmadığını belirtir. Sabit diskler için bu değer herzaman true olmaktadır. Değer true ise disk sürücüsünde media yüklüdür.
MediaType(String)

Cihaz tarafından kullanılan veya erişilen medya tipidir. Örneğin removable media.
MinBlockSize(UInt64) Erişim sırasındaki minimum blok boyutunu byte olarak verir.
Model(String)

Disk sürücüsünün üretici tarafından belirlenmiş olan model numarasının tutulduğu property’dir.
Name(String)

Cihazın adının tutulduğu property’dir.
NeedsCleaning(Boolean)

Cihazın temizlenmeye ihtiyacı olup olmadığının tutulduğu property’dir. Manuel veya otomatik temizleme olup olmadığı Capabilities property’sinin array’inde belirtilir.
NumberOfMediaSupported(UInt32)

Cihaz birden çok medyayı barındırabilme özelliğine sahipse, maksimum desteklenen medya sayısının tutulduğu property’dir.
Partitions(UInt32)

Disk sürücüsünde işletim sistemi tarafından tanınmış olan bölümlendirme sayısının tutulduğu property’dir.
PNPDeviceID(String)

Cihazın Win32 Plug and Play cihaz Id’sinin tutulduğu property’dir.
PowerManagementCapabilities(UInt16)

Cihazın güç yönetimi ile ilgili özelliklerinin tutulduğu property’dir. Aldığı değerlerin açıklamaları aşağıdaki gibidir:
0 – Bilinmiyor
1 – Desteklenmiyor.
2 – Etkin değil
3 – Güç yönetimi özellikleri etkinleştirilmiş fakat hangi özelliğin etkin olduğu veya özellik hakkındaki bilgi mevcut değil.
4 – Cihazın güç durumunu kullanıma göre değiştirebileceğini belirtir. (Power State Settable)
5 – SetPowerState metodunun desteklendiğini belirtir. (Power Cycling Supported)
6 – SetPowerState metodunun PowerState değişkeni 5 olarak set edilerek invoke edilebileceğini belirtir. (Timed Power On Supported)
7 - SetPowerState metodunun PowerState değişkeni 5 olarak set edilerek ve Time parametresinin de spesifik bir tarih ve zamana veya zaman aralığına set edilerek invoke edilebileceğini belirtir.
PowerManagementSupported(Boolean)

Cihazda güç yönetimi yapılıp yapılamayacağının tutulduğu boolean property’dir. Bu property güç yönetimi özelliklerinin etkinleştirimiş olup olmadığını belirtmez. Bu bilgi için PowerManagementCapabilities array’indeki öğelere bakılabilir.
SCSIBus(UInt32)

Diskin SCSI bus numarasını verir.
SCSILogicalUnit(UInt16)

SCSILogicalUnit property’si diskin SCSI logical unit number (LUN) bilgisinin tutulduğu property’dir.
SCSIPort(UInt16)

Diskin SCSI port numarasının tutulduğu property’dir.
SCSITargetId(UInt16) Diskin SCSI ID numarasının tutulduğu property'dir
SectorsPerTrack(UInt32) Diskteki her track'teki sektör sayısının tutulduğu property'dir.
Signature(UInt32) Diski tanımlamak için kullanılan property'dir.
Size(UInt64) Diskin boyutunun tutulduğu property'dir.
Status(String)

Cihazın o anki durumunun tutulduğu property’dir. İşlevsel ve işlevsel olmayan birçok durum tanımlanabilir. İşlevsel disk durumları “OK” (Çalışıyor), “Degraded” (Bozulmuş) ve “Pred Fail”’dir. “Pred Fail” cihazın düzgün çalıştığını ancak yakın zamanda bir hata alınabilir olduğunu belirtir. İşlevsel olmayan durumlar ise “Error” (Hata), “Starting” (Başlatılıyor), “Stopping” (Durduruluyor) ve “Service”’dir. Disk service durumundaysa diskle ilgili yönetimsel bazı işlemler yapılıyor anlamına gelir.
StatusInfo(UInt16)

Mantıksal sürücünün (logical device) durumunun tutulduğu property’dir. 3 ise etkin, 4 ise etkin değil, 2 ise bilinmeyen, 1 ise diğer başka bir durumda demektir. Bu property mantıksal sürücüye uygulanmıyorsa 5 yani uygun değildir değeri kullanılmalıdır.
SystemCreationClassName(String) Gözlemlenen sistemin CreationClassName property'sidir.
SystemName(String) Gözlemlenen sistemin ismidir.
TotalCylinders(UInt64)

Diskin üstündeki toplam silindir sayısının tutulduğu property’dir. Bu değer BIOS 13h interrupt’ının fonksiyonları kullanılarak elde edilir. Bu değer, sürücü yüksek kapasite disk boyutunu desteklemek için translation scheme kullanıyorsa doğru çıkmayabilir. Kesin sürücü spesifikasyonları için üretici firmanın sağladığı bilgiler referans alınmalıdır.
TotalHeads(UInt32)

Bu property diskin üstündeki toplam head’lerin sayısının tutulduğu property’dir. Bu değer BIOS 13h interrupt’ının fonksiyonları kullanılarak elde edilir. Bu değer, sürücü yüksek kapasite disk boyutunu desteklemek için translation scheme kullanıyorsa doğru çıkmayabilir. Kesin sürücü spesifikasyonları için üretici firmanın sağladığı bilgiler referans alınmalıdır.
TotalSectors(UInt64) Fiziksel disk sürücüsündeki toplam sektör sayısının tutulduğu property'dir. Bu değer BIOS 13h interrupt’ının fonksiyonları kullanılarak elde edilir. Bu değer, sürücü yüksek kapasite disk boyutunu desteklemek için translation scheme kullanıyorsa doğru çıkmayabilir. Kesin sürücü spesifikasyonları için üretici firmanın sağladığı bilgiler referans alınmalıdır.
TotalTracks(UInt64) Fiziksel disk sürücüsündeki toplam track sayısının tutulduğu property'dir. Bu değer BIOS 13h interrupt’ının fonksiyonları kullanılarak elde edilir. Bu değer, sürücü yüksek kapasite disk boyutunu desteklemek için translation scheme kullanıyorsa doğru çıkmayabilir. Kesin sürücü spesifikasyonları için üretici firmanın sağladığı bilgiler referans alınmalıdır.
TracksPerCylinder(UInt32) Fiziksel disk üstünde bulunan her silindirdeki track sayısının tutulduğu property'dir. Bu değer BIOS 13h interrupt’ının fonksiyonları kullanılarak elde edilir. Bu değer, sürücü yüksek kapasite disk boyutunu desteklemek için translation scheme kullanıyorsa doğru çıkmayabilir. Kesin sürücü spesifikasyonları için üretici firmanın sağladığı bilgiler referans alınmalıdır.

Bir sonraki makalemdeWin32_LogicalDisk, Win32_OperatingSystem, Win32_Process, Win32_Processor WMI class'larını inceleyeceğiz.

Işıl ORHANEL"

11 Mart 2009 Çarşamba

Dev Express Skin Ayarları


Dev express Kullanlar mutlaka olmuştur..net'in componentlerine ruh katan bu kıymetli componenti çok seveceksiniz.Özellikle benim gibi tasarım sorunları çekenleriniz varsa şiddetle denemenizi tavsiye ederim.

Deneyenler için ise Ribon Formda nasıl Otomatik stilleri seçeceklerini yazacağız.
Ayrıca Devexpressin en zor kullanılan comp. biriside comboboxlar.Combo boxlardaki rowlardaki verileri almak için ilginç taklalar atmanız gerekebiliyor mesela ( her bir eklenen rowa 1.xxx 2.yyy 3.ffff şeklinde diyip sonra noktadan ile split yaparak kaçıncı rowun geldi gibi falan .. :) ) belki bu taklalar bizim beceriksizliğimizden bilemiyorum :) her ne ise aşağıdaki kod bloğunda hem skinlerin kullanımını hemde comboxlara veri eklemenin ve onlardan veri almanın güzel bir örneği mevcut. iyi okumalar.

Imports DevExpress.XtraEditors
Imports DevExpress.Skins

' Handle the SelectedIndexChanged event to respond to selecting the skin name.
AddHandler ComboBoxEdit1.SelectedIndexChanged, AddressOf comboBoxEdit1_SelectedIndexChanged
' Add available skin names to the combo box.
For Each cnt As SkinContainer In SkinManager.Default.Skins
ComboBoxEdit1.Properties.Items.Add(cnt.SkinName)
Next cnt

'...

Sub comboBoxEdit1_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim comboBox As ComboBoxEdit = sender
Dim skinName As String = comboBox.Text
DevExpress.LookAndFeel.UserLookAndFeel.Default.SkinName = skinName
End Sub

vb6 ile MS Outlook Mail göndermek

Merhaba Bugün kü yazım Visual Basic 6 ile mail göndermek hakkında olacak.
Nereden çıktı visual Basic 6 ile yazılan eski yazılımlar var ve hala oldukca sık kullanılıyor.

şimdi devam ediyoruz.

Microsoft Visual Basic açarak Project>Refences... diyerek Referansımızı ekliyoruz Microsoft Outlook 12.0 object library ekliyoruz ama 12.0 versiyonu office 2007 paketi ile geldiğinden illaki bu versiyonu olması şart değil 11,10,9,98,8 versiyonu bile olur :).
Referansları ekledikten sonra tekrar project>microsoft common dialog control 6.0(sp6) eklemeniz gerekiyor. Benim eklediğim visual basic 6 (service pack 6) ile geliyor .Common dialog kontrolle seçtiğimiz dosyayı attachment yapmak için kullanacagız.file open dialog kontrol olarak kullanacağız zaten.
Eklemeler bitti şimdi formumuza bir buton bir tanede common dialog control ekliyoruz.
şimdi butona tıklayıp olayına aşağıdaki kodu yazıyoruz.

Private Sub Command_Click()
Dim olApp As Outlook.Application 'uygulamayı yap
Set olApp = CreateObject("Outlook.Application") 'uygulamayı ata
Dim olNs As Outlook.NameSpace 'outlook özelliklerini ata
Set olNs = olApp.GetNamespace("MAPI") 'MAPI kullan
olNs.Logon ' oturum aç
Dim olMail As Outlook.MailItem
Set olMail = olApp.CreateItem(olMailItem) ' yeni bir mail gönder Bu tip mail gönderileceğini söylüyor.
' Fill out & send message...
olMail.To = ....@gmail.com ' kime mail
olMail.Subject = "Mail Konusu..." 'konusu ne
olMail.Body = "deneme mesajımız" 'mesajımız ne
Dim dosyatamam As String
CommonDialog.ShowOpen
dosyatamam = olMail.Attachments.Add(CommonDialog.FileName, 'dosya ekle Outlook.OlAttachmentType.olByValue, 1, CommonDialog.FileName) 'ilk sıraya dosyayı ekle
olMail.Display 'dosyayı outlookla göster.
End Sub
olMail.Display yerine olMail.Send yazarsanız direk gönderede bilirsiniz. şu an da yazıdğımız kod gayet şahane bir şekilde yazdığımız
olMail.To = ".....@gmail.com"
olMail.Subject = "Mail Konusu..."
olMail.Body = "deneme mesajımız"
bu bilgiler maillere ekleniyor bunları textboxlarla ilişkilendirmekte size kalıyor.
kolay gelsin .

6 Mart 2009 Cuma

Access PopupMenu uygulaması

Merhabalar
Access ile ilgilenenleriniz olmuşsa yeni access nesnelerinin az olduğunu bilirsiniz.işinize lazım olan access nesneleri için ise en iyi çözüm tabiki API kullanmak böylece windowsun bir çok zımbırtısını access içinde kullana biliriz.işte bu gün bana bir access formundaki butona tıklandığında popup menu açılması gerekti.Buyurun bununla ilgili çözüm.

ilk olarak API leri çağıralım

Private Declare Function CreatePopupMenu Lib "user32" () As Long

Private Declare Function DestroyMenu Lib "user32" _
(ByVal hMenu As Long) As Long


Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" _
(ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, _
ByVal lpNewItem As Any) As Long


Public Declare Function TrackPopupMenu Lib "user32" _
(ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, _
ByVal nReserved As Long, ByVal hWnd As Long, ByVal lprc As Any) As Long


Şimdide Kıymetli Popup menu fonksiyonumuz

Public Function ShowReportPopupMenu(FormObject As Form) As Long
Dim lngPopupMenu As Long 'hWnd of popup menu
Dim paPopupMenu As POINTAPI 'Popup menu point
Dim lngReturn As Long 'Return value
lngPopupMenu = CreatePopupMenu()
AppendMenu lngPopupMenu, MF_STRING, 1, "MENU1"
AppendMenu lngPopupMenu, MF_STRING, 2, "MENU2"
GetCursorPos paPopupMenu
If lngPopupMenu <> 0 Then
'Show popup menu
lngReturn = TrackPopupMenu(lngPopupMenu, TPM_RETURNCMD, paPopupMenu.X, paPopupMenu.Y, _
0&, FormObject.hWnd, 0&)
End If
ShowReportPopupMenu = lngReturn
End Function


buraya kadar olan kodları bir modul içine yazabilirsiniz.

bu fonksiyonları çağırdınızda o anda farenin bulunduğu yerde menumuz çıkacaktır 1.seçenek seçilirse fonksiyon geriye 1 ,ikincisi için ise 2 değerini döndürmektedir.
Hangi seçeneğe tıklanmış olduğunu ise fonksiyonun geriye döndürdüğü değerden pek iyi anlayabiliriz.

5 Mart 2009 Perşembe

Nedir SOAP ?

Nedir SOAP ?

Merhabalar, bu yazıda SOAP’u ,yani Simple Object Access Protocol’u , yani direk türkçe çevirisiyle, Basit Nesne Ulaşım Protokolü’nü ve yani merkezi olamayan , dağınık uygulamalarda bilgi taşımaya yarayan protokolü tanıyacağız. SOAP kullanarak nesne transferi yapan, herhangi bir XML Web Servisini oluşturmadan veya çağırmadan önce, SOAP protokolünün detaylarını ve çalışma yapısını öğrenmek faydalı olacaktır.

Aslında , SOAP ve HTML in birbirlerini tamamlayan, eksiklerini kapatan iki teknoloji olduğunu söylemek gerekir. Bilindiği üzere HTML sadece “hypertext” transfer etmek amacıyla oluşturulmuş bir yapıdır, nesne transfer edemez, bu eksiği SOAP kapamaktadır.

SOAP ‘un eksikliği ise ,sadece -göndericiden alıcıya- tek yönlü veri transferi gerçekleştirebiliyor olmasıdır , ancak Web Servisleri “response/request” modeline ihtiyaç duymaktadır, dolayısıyla SOAP paketleri HTML paketlerinin içine gömülü olarak gönderilir.

SOAP dört ayrı kısımdan oluşmaktadır ;

1-SOAP Envelope : Mesajın içeriğini, mesajı kimin proses edeceğini ve bu mesajın opsiyonel yada zorunlu olup olmadığını içerir.

2-SOAP Encoding rules : Serializasyon mekanizmasını tanımlar.

3-SOAP RPC representation : Uzaktan prosedür çağırımı ve bunların geri dönüşlerini tanımlar.

4-Protocol binding : SOAP un HTTP içinde nasıl kullanılacağını tanımlar.

Ancak unutulmamalıdır ki, Encoding ve RPC detaylarını .NET Framework bizim için halletmektedir yani bizim uğraşmamıza pek gerek yoktur.

Bir SOAP mesajında root element (kök eleman), Envelope dur.Envelope zorunlu bir şekilde Body ve opsiyonel olarak Header ve Fault elementlerini içerir.

Envelope : Root

Header : Root un (Envelope) ilk alt elementi dir.Authentication (yetkilendirme), transaction management (Hareket yönetimi), payment gibi yapıların yönetimi bu blokta yapılır.

Body : Eğer header elementi yoksa body elementi envelop un yani root un ilk alt elementi olur.Web servisleri yapısında body , WS metodlarının, onların parametrelerinin ve dönüş değerlerinin konumlandırıldığı kısımdır.

Fault : Eğer Fault elementi varsa bu element Body nin içinde yer alır. Bu element hata ve statu kodunu taşımak için vardır.

Aşağıdaki elementi inceleyiniz:





HTTP/1.0 500 Internal Server Error

Content-Length: 460

Content-Type: text/xml; charset='utf-8'



<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/”>

<soap:Body>

<soap:Fault>

<faultcode>123XYZ</faultcode>

<faultstring>Server Error</faultstring>

<detail>

<bank:faultdetails xmlns:bank='urn:OnlineBank'>

<message>Your account is overdrawn</message>

<errorcode>1234</errorcode>

</bank:faultdetails>

</detail>

</soap:Fault>

</soap:Body>

</soap:Envelope>





SOAP : .NET Framework kullanarak



ASP.NET kullanarak bir XML Web Servisi yazdığınızda, sunucuya gidip gelen SOAP mesajlarını kontrol eden mekanizma otomatik olarak oluşturulur.

Aşağıda bir XML Web Servisi metodunu çağıran SOAP örneğini görüyorsunuz:

<?xml version='1.0' encoding='utf-8'?>

<soap:Envelope namespaces omitted for brevity>

<soap:Body>

<DocumentLiteral xmlns='http://www.contoso.com'>

<address>

<Street> One Microsoft Way</Street>

<City> Redmond</City>

<Zip>98052</Zip>

</address>

<useZipPlus4>True</useZipPlus4>

</DocumentLiteral>

</soap:Body>

</soap:Envelope>

Aşağıdaki kod, yukarıda bulunan SOAP mesajını oluşturmak için kullanılır..:

public static string BuildSOAPMessage()

{

MemoryStream st;

string str;

byte [] buffer;

st = new MemoryStream(1024);

XmlTextWriter tr = new XmlTextWriter(st,Encoding.UTF8);

tr.WriteStartDocument();

tr.WriteStartElement('soap','Envelope',!

'http://schemas.xmlsoap.org/soap/envelope/');

tr.WriteAttributeString('xmlns','xsi',null,!

'http://www.w3.org/2001/XMLSchema-instance');

tr.WriteAttributeString('xmlns','xsd',null,!

'http://www.w3.org/2001/XMLSchema');

tr.WriteAttributeString('xmlns','soap',null,!

'http://schemas.xmlsoap.org/soap/envelope/');

tr.WriteStartElement('Header',!

'http://schemas.xmlsoap.org/soap/envelope/');

tr.WriteStartElement(null,'MyHeader','http://woodgrovebank.c

om');

tr.WriteElementString('Username','Pat');

tr.WriteElementString('Password','pwd');

tr.WriteEndElement();

tr.WriteEndElement();

tr.WriteStartElement('Body',!

'http://schemas.xmlsoap.org/soap/envelope/');

tr.WriteStartElement(null,'GetAccount','http://woodgrovebank

.com');

tr.WriteElementString('acctNumber','1234');

tr.WriteEndElement();

tr.WriteEndElement();

tr.WriteEndDocument();

tr.Flush();

buffer = st.GetBuffer();

Decoder d = Encoding.UTF8.GetDecoder();

char [] chars = new char[buffer.Length];

//skip the byte order mark

d.GetChars(buffer,2,buffer.Length-2,chars,0);

str = new String(chars);

tr.Close();

st.Close();

return str;

}"

Multi Threating (çok kanallı uygulama geliştirme)

Merhabalar
Bu ilk yazım ve bu gün benim için çok önemli bir gün çok katmanlı uygulamalar ile biraz .net servisleri üzerine yoğunlaştım. Merhaba dünya yazdıktan sonra biraz ağır olacak ama
İŞTE MUTLİ THREATING (çok kanallı uygulamalar)
Uygulama geliştirirken temel sorunlarından birisi bir uygulama geliştirirken bir iş yapılırken diğer işlerin hatta .NET için ekranın görüntüsünün bile silinmesi olmaktadır.Hatta bir hesaplama yaparken progressbar'ın ilerlememesi yada formun bir yerlerinde işlem yaparken başka bir işlem yapamamız bu tip durumlar ve senoryalar saymakla bitmez ilacı ise Multi Threating tabiki.
Yazgelistir makalesinden küçük bir alıntı ve yorumlarımı koymayı çok isterim

Buraya kadar thread ile ilgili kafanızda bir şeyler oluşmuştur. Ancak kötü bir haberim var. Threadler gerçekten işlerini aynı anda yapmıyorlar. İşlemci threadlerimize belli bir zaman dilimi veriyor – burada milisaniyelik zamanları düşünelim- threadler arasında çok hızlı geçişler yapıyor ve biz bunu algılamıyoruz. Bu noktada belirtmeliyim ki threadlerin çalışması işlemciden işlemciye bile değişebilir. Birçok algoritması vardır. Örneğin hepsine aynı zaman dilimini ayırılabilir, önceliklerine göre zaman verilebilir, en kısa sürede bitene göre ya da bitimine en az süre kalana göre zamanlama ayarlanabilir. Bu bizi pek ilgilendirmiyor ama.
Thread’lerin “ready”,”blocked”,”running” ve “terminated” durumları vardır. Running moda olan thread aktiftir ve işlemciyi kullanır. Blocked moddaki thread ise beklemededir.(Örneğin bir girdi[input] bekliyordur.) Ready moddaki thread ise çalışma sırasının kendisine gelmesini bekliyordur. Terminated moddaki ise çalışmasını bitirmiştir.


Threat mantığından ve proceslere nasıl .net framework'un paylaşım yaptığından bahis ediyor.
yani aslında bir işlem yapılırken siz başka bir işlemi yaptığınızda işlemci sizin yaptığınız olay process lerine odaklanıyor ve olay process bittiğinde ise kaldığı yerden devam ediyor böyle çok katlı bir imaj veriliyor (Çift çekirdekli sistemlerde mimari ve işleyiş nasıldır bilmiyorum ? şu an belki process ler hiç bölünmüyordur)


Thread ile ilgili mantıksal anlatım yeterli olmuştur sanırım. Artık C# ile kullanmaya başlayalım.
Thread ile çalışmak için System.Threading isim uzayını kullanmalıyız.
Örnek bir uygulama yapmak istiyorum. Bir adet listBox ve 4 adet buton kontrolünü forma yerleştirelim. (Başlat düğmesi, Duraklat Düğmesi, Devam Et Düğmesi, İptal Et Düğmesi)
Başlat düğmesine basınca sayılar yazılsın, bunu duraklatıp devam edebilelim ya da iptal edebilelim.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace ThreadDeneme0
{
public partial class Thread1 : Form
{
public Thread1()
{
InitializeComponent();
}
private void Thread1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread t = null;
private void btnBaslat_Click(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(Yazdir);
t = new Thread(ts);
t.Start();
}
public void Yazdir()
{
for (int i = 0; i < 10000; i++)
{
listBox1.Items.Add(i);
}
MessageBox.Show("Bitti");
}
private void btnDuraklat_Click(object sender, EventArgs e)
{
t.Suspend();
}
private void btnDevamEt_Click(object sender, EventArgs e)
{
t.Resume();
}
private void btnIptal_Click(object sender, EventArgs e)
{
t.Abort();
}
}
}


Kırmızı yazdığım alttaki kodlara dikat işte bu kodlar yeni bir kanal açıp ele avuca sığmaz programlar yapmamızı sağlıyor.
ThreadStart ts = new ThreadStart(Yazdir);
t = new Thread(ts);t.Start();

Thread konusunun daha da anlaşılır olması için uygulamamıza bir eklenti daha yapacağım. 5. Bir düğme daha ekleyin forma. Click eventine ve altına aşağıdaki kodu yazın.


private void button5_Click(object sender, EventArgs e)
{
Thread u = new Thread(Goster);
u.Start ;
}
void Goster()
{
MessageBox.Show("Siyah beyaz-ölüm yaşam");
}


Normalde bir mesaj kutusu çıkınca sizinle etkileşime girerdi. Yani bir tuşa basardınız ve arka plandaki çalışma ondan sonra devam ederdi, siz mesaj kutusunda bir düğmeye vs. basmadıkça tüm işler dururdu. Ancak göreceksiniz ki bir tarafta mesaj kutusu açık kalacak, diğer tarafta ana forma geçiş yapabileceksiniz ve orada da işlerin sürdüğünü göreceksiniz.

Threat ile ilgili harika bir örnek vererek yazımı burada bitiyor.

{Merhaba Dünya}

ilk Blog yazım {MERHABA DUNYA}
Diyerek blogumuza ilk yazımı ekliyorum.
Bloğumda geliştirdiğim uygulamalarda yaşadığım sorunlar ve çözümlerini paylaşacağım.hiç yazı yazmayı sevmem ama önce kendim için paylaşmam lazım sonrada sizin için :)
Tekrar tekrar aynı hatayı ayıklamaktansa açar bloğuma bakarım fikri ile oluşturdum bu blogu
aslında hazır araçları hiç sevmem ama kendi yazdıklarımız dandik oluyor yaw :(

yaz yaz bitmiyor ödenek vardıda biz mi yazmadık yazamazsak ozaman gelin diyin kendin yazamıyor musun? bloggerden çalıntılıyorsun diye