WaitforSingleObject nedir Nerede ve nasıl kullanılır?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
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.
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
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.
Örnek Kullanım :
- 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.

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;
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;
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
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 :
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.
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();
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
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
Gerek yok Bilg. Müh. filan okumanıza
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 ...

Siz başlayın, takıldığınız yerde yardımcı olmaya çalışırım ...
Ömür Ölmez
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
- Ben de örneğin Sleep(5000) dediğin zaman beklerken oluşan donmadan kaynaklı bir sıkıntı diye değerlendirmiştim.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.
- 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.

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
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 ...
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
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
+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...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 ...

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
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.
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
- Çö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.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.
- 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;
Kod: Tümünü seç
xSuAndaMesgulum := True;
Kod: Tümünü seç
TTimer(Sender).Enabled := False;
xSuAndaMesgulum := False;
- Profesyonel olması; bilerek neyi nasıl kullandığın ile ilişkili. Yoksa bütün yollar Roma...

Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
Küçük bir hatırlatma; TTimer thread-safe değildir. O yüzden thread içerisinde kullanmaktan kaçınmakta fayda var.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.
There's no place like 127.0.0.1
Re: WaitforSingleObject nedir Nerede ve nasıl kullanılır?
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