14-09-2020, Saat: 11:51
(Son Düzenleme: 14-09-2020, Saat: 11:52, Düzenleyen: sadettinpolat.)
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.
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.

