WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen thelvaci »

Belli başlı işletim sistemi nesnelerini beklemek üzerine inşa edilmiş bir Windows API'dir kendisi. Kullanımı ile alakalı bir dizi açıklamayı sitemdeki thread makalelerinde gözlemleyebilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen mrmarman »

Merhaba...

- Kullandığım bir yöntemi paylaşayım...Aşağıdaki şekilde procedure haline getirdim. Bu şekliyle bir deneyin, Sure kısmına da 1000 x 5 = 5000 derseniz 5 saniye. Miisaniye cinsinden vermelisiniz veya verilen değeri milisaniye cinsine procedure içerisinden çevirirsiniz. Karar sizin. :idea:

Kod: Tümünü seç

Procedure MiliSaniyeBekle( Sure:Cardinal );
Var
  Tick : Cardinal;
begin
  Tick := GettickCount + Sure;
  while GetTickCount < Tick do
  begin
    Sleep(1);
    Application.ProcessMessages;
  end;
end;
Örnek Kullanım :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if MessageDlg('Başlasın mı ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes
  then begin
    MiliSaniyeBekle( 5000 );
    ShowMessage( '5 saniye bekledik... ');
  end;
end;
Resim
Resim ....Resim
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen omurolmez »

WaitForSingleObject adından da anlaşılacağı gibi bir nesneyi bekleyen işlevdir.

Aradığınız türde işlemi gerçekleştirebilmek için, ana kanalınız (thread) klasik Windows haberleşmesi ekran ve klavye giriş çıkışlarını yürütürken, bu kanal içinde başlatacağınız ikinci bir kanal, asıl işi yapmalıdır.

İşte bu ikinci kanalı, iş yokken(veya tamamlandığında) bu api ile beklemeye alabilirsiniz. Veya kanal belli bir işlem sonucunu beklerken yine bu api ile beklemeye alabilirsiniz.

WaitForSingleObject ve WaitForMultipleObjects apileri, bir veya daha fazla nesneyi belirttiğiniz bir süre boyunca veya sonsuza kadar beklerler. Bu bekleme sırasında, kanala ayrılan cpu kaynağı tamamen kesilir ve dolayısıyla en performanslı bekleme yöntemi budur (Sleep apisi ile de bekleme boyunca kanala ayrılan cpu kaynağı kesilir).

WaitFor işlevlerinin beklemesi sırasında kanal tamamen dondurulduğu için, sürekli çalışarak Windows mesajlarını işlemesi gereken ana kanalda kullanılamazlar; daima ikinci ve sonraki kanallarda kullanılabilirler.

WaitFor api leri Windows ta dosya sistemi, network tcp-ip ve fiber (pipe) sistemi, mesaj sistemi vb bir çok diğer api tarafından desteklenir. Ayrıca, kanalların durup durmadığı, CreateProcess işlevi ile oluşturulan yeni prosesin işinin bitip bitmediği bile bu api ler ile gözlenebilir (Bu kadarla sınırlı değil).

Ayrıca Windows, events sayesinde tamamen programcının kullanımına da bu api leri sunar.

Basit bir örnek şöyle olabilir :

Kod: Tümünü seç

//Kanal Kodu A
//event1 nesnemizin başlatıldığını farzedelim :
if YeniVeriAlimiTamamlandi then
  SetEvent(event1);

Kod: Tümünü seç

//Kanal Kodu B
WaitForSingleObject(event1, INFINITE);
VeriIsleme();
Yukarıda, kanal A bizim vcl main thread imiz olsun, kanal B ise, kendi oluşturduğumuz TThread nesnemiz olsun.
Bu durumda, main vcl thread içinde herhangibir buton click vs ile yukarıdaki kodu çalıştırdığımız anda, kanal B, VeriIsleme işlevini çalıştırmaya başlar.
Ancak, kanal A SetEvent(event1) çağrısında durmaz ve çalışmaya kaldığı yerden devam eder.
Vaktim olmadığı için daha fazla yazamadığım bu temel örnek, çok kanallılığın performansı ve senkronizasyon hakkında önemli ip uçları veriyor aslında.
Ömür Ölmez
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen omurolmez »

Gerek yok Bilg. Müh. filan okumanıza :D Benim kötü anlatımıma aldanmayın sakın, göründüğü kadar zor değil.

Siz başlayın, takıldığınız yerde yardımcı olmaya çalışırım ...
Ömür Ölmez
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen mrmarman »

fatihbarut yazdı:teşekkür ederim. Yaklaşım güzel ancak benim aradığım biraz daha farklı.
şöyleki örneğin command console gibi bir programı çalıştırdığınızda verdiğiniz komut bitince bunu farkedecek bir thread tarzında bir şey arıyorum.
tekrar teşekkür ederim.
- Ben de örneğin Sleep(5000) dediğin zaman beklerken oluşan donmadan kaynaklı bir sıkıntı diye değerlendirmiştim.

- Sizin istediğiniz; WinExec ile bir DOS mode (yani başlat/çalıştır dediğimizde; CMD komutu ile çıktığımız komut satırından bahis) çalıştırılan uygulamanın bitene kadar beklenmesi, aynı zamanda komut ekranında dönen değerleri anlık olarak takip etmek ise tam da doğru noktayı yakalamışsınız demektir. WaitForSingleObject tam da bu işi yapıyor.

- Bunun için direkt kod yardımı almanız yeterli. Bu linkteki işlem tam da istediğinizi değerlendirdiğim (yanılmış da olabilir) işlemi yapıyor.

- Ben bunu FFMpeg.EXE ile birden fazla fotoğraf karesini bir araya getirip MP4 formatında bir videoğa dönüştürmek için kullanmıştım. :idea: O da dos mode çalışan bir uygulama ve her anında işlem yapılan FRAME numarası ile sıkıştırma oranını alıp Delphi formumda ekrana yansıtarak, 3 - 5 dakikalık süre boyunca hem bir ProgressBar koyabilmiş hem de kullanıcıyı hangi aşamada olduğum konusunda bilgilendirme imkanı bulmuştum.
Resim
Resim ....Resim
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen omurolmez »

O zaman ayrı bir kanal içinde işlem yapmalısınız. ExecuteProcess, vb api nizi ve WaitForSingleObject api nizi, bu TThread nesnesinin Execute koduna koymalısınız. main vlc thread ile haberleşmek için ise, PostMessage kullanabilirsiniz.

Farkettiğiniz üzere, yapmak istediğiniz işleme dair en ufak bir fikir yürütmeden; sadece yazdıklarınıza göre cevap yazıyorum. Eğer bana "ben aşağıdaki kodu, programı kilitlemeden çalıştırmak istiyorum" diye bir mesaj atarsanız, ona göre yazarım ...
Ömür Ölmez
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen mrmarman »

omurolmez yazdı:Farkettiğiniz üzere, yapmak istediğiniz işleme dair en ufak bir fikir yürütmeden; sadece yazdıklarınıza göre cevap yazıyorum. Eğer bana "ben aşağıdaki kodu, programı kilitlemeden çalıştırmak istiyorum" diye bir mesaj atarsanız, ona göre yazarım ...
+1 hakikaten böyle bir durum söz konusu... Sanki belli bir hedefiniz yok da, delphi hakkında gördüklerinizi forumda bir sorayım da belki işe yarar bir proje aklıma gelir cinsinden bir akış oluyor... :)
Resim
Resim ....Resim
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen nguzeller »

bu tip işler için çok profisyonel olmasada kullandım yöntem timer1 işlen başladığnda aktif ediyorum, işlem sonlanmış mi kontrol ediyor, sonlanmışsa kendini durduyor, işlen sonunda ne yapalmısı gerikiyor yapıyor. bu işleni yapan daha profesyonel çözemler öğrenmek isterim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen mrmarman »

nguzeller yazdı:bu tip işler için çok profisyonel olmasada kullandım yöntem timer1 işlen başladığnda aktif ediyorum, işlem sonlanmış mi kontrol ediyor, sonlanmışsa kendini durduyor, işlen sonunda ne yapalmısı gerikiyor yapıyor. bu işleni yapan daha profesyonel çözemler öğrenmek isterim.
- Çözümün profesyonel olanıdır veya değildir bilmem ama ben olsam yukarıda verdiğim linkteki işi Thread açıp öyle kullanırdım. Şöyle ki projemizin iki farklı proje gibi çalıştığını ve çalışırken de içerik hakkında her iki projede de senkronize bir şekilde birbiri içerisinden bilgi alıp ekrana yansıtma imkanınız olduğunu düşünün.

- Timer ile kullanmak ta bundan farklı değil zaten. Örneğin xSuAndaMesgulum gibisinden bir GLOBAL değişken tanımlayıp, Timer'in girişinde

Kod: Tümünü seç

if xSuAndaMesgulum then EXIT;
komutu verip hemen altına

Kod: Tümünü seç

xSuAndaMesgulum := True;
ve kodlarını yazdıktan sonra en son satırına da

Kod: Tümünü seç

TTimer(Sender).Enabled := False;
xSuAndaMesgulum := False;
dediğini düşün. xSuAndaMesgulum değişkeni Timer intervali ne olursa olsun birden fazla çalışmasını engellemeye yeter. Bedavadan da Thread kurmuş olursun vs. kısaca aynı işlemi senin dediğin şekilde bu da görür.

- Profesyonel olması; bilerek neyi nasıl kullandığın ile ilişkili. Yoksa bütün yollar Roma... :bravo:
Resim
Resim ....Resim
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen SimaWB »

nguzeller yazdı:bu tip işler için çok profisyonel olmasada kullandım yöntem timer1 işlen başladığnda aktif ediyorum, işlem sonlanmış mi kontrol ediyor, sonlanmışsa kendini durduyor, işlen sonunda ne yapalmısı gerikiyor yapıyor. bu işleni yapan daha profesyonel çözemler öğrenmek isterim.
Küçük bir hatırlatma; TTimer thread-safe değildir. O yüzden thread içerisinde kullanmaktan kaçınmakta fayda var.
There's no place like 127.0.0.1
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?

Mesaj gönderen omurolmez »

Arkadaşlar, bir iki gün içinde, bir konsol uygulamasını, ayrı bir kanal (thread) içinde çalıştıran bir örnek delphi uygulamasını buradan mesaj olarak göndereceğim ...
Ömür Ölmez
Cevapla