Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
100 puan değerinde (Threading)
#51
(03-05-2018, Saat: 17:03)hyperxman Adlı Kullanıcıdan Alıntı:
(02-05-2018, Saat: 10:55)edo Adlı Kullanıcıdan Alıntı: Ayrıca WaitForMultipleObjects metodu için şu linkte bilgi var, sanırım yazarı tanıyoruz bir yerlerden  Cool

@Bahadir.Alkac sanırım doğru yolu buldunuz, tebrikler desem mi acaba şimdiden  Rolleyes

@Tuğrul HELVACI hocam bu yoruma ithafen yazdim. O kadar araştırdım cikmadiysa hata vardır diye tahmin ettim. Smile Ders niteliğinde ki soruya gelince WaitForMultipleObjects yapısı için sorduğunuz soru yani bu soru Big Grin

@canbir Tuğrul hocanın sitesinden bahsediyorum... Smile
Mesajımı, Tuğrul Bey'in "Bu arada merak ettim: "ders niteliğinde ki sorunuz" hangisi ? " sorusuna istinaden yazmıştım.
Cevapla
#52
(06-05-2018, Saat: 00:52)canbir Adlı Kullanıcıdan Alıntı:
(03-05-2018, Saat: 17:03)hyperxman Adlı Kullanıcıdan Alıntı: @Tuğrul HELVACI hocam bu yoruma ithafen yazdim. O kadar araştırdım cikmadiysa hata vardır diye tahmin ettim. Smile Ders niteliğinde ki soruya gelince WaitForMultipleObjects yapısı için sorduğunuz soru yani bu soru Big Grin

@canbir Tuğrul hocanın sitesinden bahsediyorum... Smile
Mesajımı, Tuğrul Bey'in "Bu arada merak ettim: "ders niteliğinde ki sorunuz" hangisi ? " sorusuna istinaden yazmıştım.
 Hatlar feci şekilde karıştı üstat sakince bekleyelim Big Grin
Yazılım Topluluğumuz -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla
#53
(06-05-2018, Saat: 00:52)canbir Adlı Kullanıcıdan Alıntı:
(03-05-2018, Saat: 17:03)hyperxman Adlı Kullanıcıdan Alıntı: @Tuğrul HELVACI hocam bu yoruma ithafen yazdim. O kadar araştırdım cikmadiysa hata vardır diye tahmin ettim. Smile Ders niteliğinde ki soruya gelince WaitForMultipleObjects yapısı için sorduğunuz soru yani bu soru Big Grin

@canbir Tuğrul hocanın sitesinden bahsediyorum... Smile
Mesajımı, Tuğrul Bey'in "Bu arada merak ettim: "ders niteliğinde ki sorunuz" hangisi ? " sorusuna istinaden yazmıştım.

Merhaba,
Cevap veren üyelerimizden kime 100 puan verdiğine bakarak, @Tuğrul HELVACI  hocamın onayladığı doğru cevabı görebilirsiniz.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#54
Doğru cevap belli aslında üstadım. CPU'nun yükü yüksek olmayacak ve ana thread kilitli durumda kalmayacak. İlgili API'leri de paylaştık. Bundan sonrası, okumak, anlamak ve uygulamak.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#55
Yıllardır Application.ProcessMessage lafını kullanmadığım proje neredeyse yok gibidir, çünkü önemli bir ihtiyaca cevap verir. Aynı zamanda bu projelerin çoğu çok ciddi ve pahalı projelerdir. Bu komutun cpu'ya yük bindirdiğinin de farkındaydım ama işim de görüldüğüne göre çok daha uygun bir çözüme gitme ihtiyacı hissetmedim hiç. Aynı zamanda Delphi ile ilgili dökümanlarda, örneklerde, forumlarda hep bu komut kullanılır. Dolayısıyla bir arayışa gerek yoktu çok da elzem değildi.
Bu topic çok ilgilimi çekti ve beni araştırmaya yapmaya yöneltti. Çok da tırmalamaya gerek kalmadan sorunun çözümünü buldum hem de 1 değil 2 farklı çözüm buldum. Artık Application.ProcessMessage kullanmıyorum, bu soruyu sorduğunuz için çok teşekkürler. Böyle bir sorunun cevabının olduğunu bilmek benim için yeterliydi, gerisi okumak, araştırmak, denemek ve uygulamak.
Cevapla
#56
Gecenin bir yarısı bu konuyu nereden gördüysem. Çok eski konu fakat daha önce görmemişim. Gecenin yarısını geçtik kafama takıldı bir kere hala uğraştırıyor. Yarın iş var bu kadar yeter.

@Tuğrul HELVACI hocam açıkçası thread lerle ilgili olarak diğer büyük çoğunluk gibi benimde tecrübem olmadı desem çok yerinde olur. Fakat verdiğiniz anahtar kelimelerle bir şeyler karaladım ama WaitMessage döngü içinde takılıp kalıyorum. Kodunda çok mantıklı olduğunu düşünmüyorum. While içinde kaldığı için "Thread bitti" yazısını görmüyorum. Fakat normal olarak Thread başladığı için bir şekilde "Thread Msg" yazısını görüyorum. Daha sonra WaitMessage nedir onuda araştırmam gerekiyor. Ayrıca yazdığım kodu da anlat desen kocaman ? olur.

procedure TForm3.Button1Click(Sender: TObject);
var
 Thrd : TThread;
 AMsg: tagMSG;
begin
 Thrd := TThread.CreateAnonymousThread(
   procedure
   begin
     Sleep(10000);
     Memo1.Lines.Add('Thread Msg');
   end
 );

 Thrd.Start;

 case MsgWaitForMultipleObjects(1, Thrd, False, INFINITE, QS_ALLINPUT) of
   WAIT_OBJECT_0: Memo1.Lines.Add('wait 0');
   WAIT_OBJECT_0+1:
     begin
       while WaitMessage do
         while PeekMessage(AMsg, Handle, 0, 0, PM_REMOVE) do
         begin
           TranslateMessage(AMsg);
           DispatchMessage(AMsg);
           Break;
         end;
     end;
   WAIT_ABANDONED: Memo1.Lines.Add('Abandoned');
   WAIT_IO_COMPLETION: Memo1.Lines.Add('IO Complete');
   WAIT_TIMEOUT: Memo1.Lines.Add('Timeout');
   WAIT_FAILED: Memo1.Lines.Add('Failed');
 else

 end;

 // Yukarıdaki thread kendi içinde 10 sn bekliyor. Biz de tam bu nokta da yukarıdaki thread'in bitmesini bekleyeceğiz. Ama nasıl ;-)
 Memo1.Lines.Add('Thread bitti');
end;

Kolay gelsin teşekkürler.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#57
@Tuğrul HELVACI 

hocam hakikaten bu konu bir çok kere okudum ve acaba yanlışmı anlıyorum artık bende anlamıyorum.
WaitMessage = kullanıldı kanala her hangi bir mesaj gelmesini bekliyor.
MsgWaitForMultipleObjects =Wait foksiyonları için özellikle window oluşturmuş Thread lerda;

ama ne yaptı isem label1 deki sistem saati kilitlenmesi çözemedim.
Lütfen sizin çözümünüzü veya başka bir örnek ile bir açıklama getirirmisiniz.
Cevapla
#58
Aynı anda birden fazla thread kullandığım uygulamam mevcut.

A Thread'inin Execute metodu 10 dakika sürüyor diyelim. A Threadi veritabanı işlemleri yapıyor ve gerekli yerlerde elde ettiği sonuçları Synchronize metodu ile vcl deki bir bileşene yazıyor. İşi bitince otomatik olarak free oluyor. (Test amaçlı bütün işlemleri iptal edip sadece gettickcount ile 10 dakika bekleyecek şekilde düzenleme de yapıldı , sonuç değişmedi)

Modal olarak açılan başka bir formda (TFormModal) ise  B Threadini çalıştıran bir düğme mevcut , bir de formu kapatmak için bir Kapat düğmesi.
B Threadi web servis isteğinde bulunuyor ve CoInitializeEx gibi komutlar kullanıyor. ThreadDone ile işlem bittiğinde form üzerindeki nesnelere servisten dönen bilgileri aktarıyor.

Buraya kadar herşey normal gibi ama bazı windows 10 larda B threadi web servisten bilgiyi almasına ve ThreadDone olayı tetiklenmesine rağmen aldığı bilgileri formdaki bileşenlere yansıtmıyor. Bekleme moduna giriyor. Ne zamanki A Threadi işlemi bitiyor , B threadi kaldığı yerden devam ediyor.

Aynı şekilde Kapat düğmeside işe yaramıyor. Aslında yarıyor ama yine A Thredi bitene kadar kapat komutu işlemiyor, a threadi bittiğinde 2 dakika önce tıkladığım kapat düğmesi görevini yapıp formu kapatıyor.

Eğer TFormModal ekranını açıp B Threadini çalıştırmadan direkt Kapat düğmesine tıklarsam herhangi bir problem olmuyor. Düğmeye basar basmaz form kapanıyor.

Bu sorunla ilgili araştırma yaparken bir çok kişinin application.processmessages komutunun sorunlu olduğunu mümkünse hiç kullanılmamasını tavsiye ettiklerini gördüm.
Hatta bazı kullanıcılar kendi processmessages metodunu yazıp bunu kullandıklarını gördüm.

https://stackoverflow.com/questions/3061...ssmessages

Bu hatanın olduğu işletim sisteminde şöyle bir hata daha oluyor.

A Threadi çalışırken herhangi bir fastreport ile yapılmış rapor önizlemesi açmaya çalıştığımda rapor arka planı gri önizleme penceresi açılıyor ama raporu göstermiyor.
Ne zamanki A threadi çalışmayı bitiyor o zaman rapor bilgileri de düzgün bir şekilde ekrana geliyor.
WWW
Cevapla
#59
(14-09-2020, Saat: 11:51)sadettinpolat Adlı Kullanıcıdan Alıntı: Aynı anda birden fazla thread kullandığım uygulamam mevcut.

A Thread'inin Execute metodu 10 dakika sürüyor diyelim. A Threadi veritabanı işlemleri yapıyor ve gerekli yerlerde elde ettiği sonuçları Synchronize metodu ile vcl deki bir bileşene yazıyor. İşi bitince otomatik olarak free oluyor. (Test amaçlı bütün işlemleri iptal edip sadece gettickcount ile 10 dakika bekleyecek şekilde düzenleme de yapıldı , sonuç değişmedi)

Modal olarak açılan başka bir formda (TFormModal) ise  B Threadini çalıştıran bir düğme mevcut , bir de formu kapatmak için bir Kapat düğmesi.
B Threadi web servis isteğinde bulunuyor ve CoInitializeEx gibi komutlar kullanıyor. ThreadDone ile işlem bittiğinde form üzerindeki nesnelere servisten dönen bilgileri aktarıyor.

Buraya kadar herşey normal gibi ama bazı windows 10 larda B threadi web servisten bilgiyi almasına ve ThreadDone olayı tetiklenmesine rağmen aldığı bilgileri formdaki bileşenlere yansıtmıyor. Bekleme moduna giriyor. Ne zamanki A Threadi işlemi bitiyor , B threadi kaldığı yerden devam ediyor.

Aynı şekilde Kapat düğmeside işe yaramıyor. Aslında yarıyor ama yine A Thredi bitene kadar kapat komutu işlemiyor, a threadi bittiğinde 2 dakika önce tıkladığım kapat düğmesi görevini yapıp formu kapatıyor.

Eğer TFormModal ekranını açıp B Threadini çalıştırmadan direkt Kapat düğmesine tıklarsam herhangi bir problem olmuyor. Düğmeye basar basmaz form kapanıyor.

Bu sorunla ilgili araştırma yaparken bir çok kişinin application.processmessages komutunun sorunlu olduğunu mümkünse hiç kullanılmamasını tavsiye ettiklerini gördüm.
Hatta bazı kullanıcılar kendi processmessages metodunu yazıp bunu kullandıklarını gördüm.

https://stackoverflow.com/questions/3061...ssmessages

Bu hatanın olduğu işletim sisteminde şöyle bir hata daha oluyor.

A Threadi çalışırken herhangi bir fastreport ile yapılmış rapor önizlemesi açmaya çalıştığımda rapor arka planı gri önizleme penceresi açılıyor ama raporu göstermiyor.
Ne zamanki A threadi çalışmayı bitiyor o zaman rapor bilgileri de düzgün bir şekilde ekrana geliyor.

Bu işletim sistemi değil de sistem performansı ile alakalı olabilir mi? Mesela ağır bir işlemi yaparken gif oyanatmaya çalıştığım ama bir türlü yapamadığım bir projem vardı ama yıllar sonra denediğimde proje çalışıyordu :Smile Hiç dokunmadığım projenin eskiden çalışmamasına ama şimdi çalışmasına neden olarak  daha üst düzey ve çok çekirdekli sistemler olabilir diye tahmin ettim ama üzerinde fazla durmadım.
Cevapla
#60
Evet en son delphipraxis.net forumu karıştırdım. Smile Aşağıdaki kod çalışıyor. Fakat muhtemelen @Tuğrul HELVACI hocam senin istediğin yapı değil. WaitMessage anahtar vermiştiniz. Bu kullanılmıyor. Takıldım bu API işine sizin sitede de bu api ile alakalı bir örnek bilgilendirme bulamadım. WaitForMultipleObjects var fakat MsgWaitForMultipleObjects yok. Merakla sizin çözümünüzü bekliyorum.
procedure TForm2.Button1Click(Sender: TObject);
var
 Thrd : TThread;
 Ret: Cardinal;
 HandleArray : array [0..0] of THandle;
begin
 Thrd := TThread.CreateAnonymousThread(
   procedure
   begin
     Sleep(10000);
   end
 );

 Thrd.Start;
 Thrd.OnTerminate := ThreadTerminate;
 HandleArray[0] := Thrd.Handle;

 while true do
 begin
   Ret := MsgWaitForMultipleObjects(1, HandleArray[0], False, INFINITE, QS_ALLINPUT);
   case Ret of
     WAIT_OBJECT_0:begin
       Memo1.Lines.Add('WAIT_OBJECT_0');
       break;
     end;

     WAIT_OBJECT_0+1: begin
       Application.ProcessMessages;
       continue;
     end;

     WAIT_TIMEOUT: break;
     WAIT_FAILED: continue;
     WAIT_ABANDONED: continue;
     WAIT_IO_COMPLETION: continue;
   else
     Memo1.Lines.Add('Else')
   end;
 end;
 Memo1.Lines.Add('Thread finish');
end;

procedure TForm2.ThreadTerminate(Sender: TObject);
begin
  Memo1.Lines.Add('Thread terminated');
end;
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla




Konuyu Okuyanlar: 2 Ziyaretçi