Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Thread içinde CoInitialize(nil) ve CoUninitialize
#1
Merhaba arkadaşlar.
Thread içersinde veritabanından sorgu yapıyorum (30 sn peryotta.). 
JvThread nesnesini kullandım ve yaşayan bir thread tasarlamaya çalıştım.
@Tuğrul HELVACI hocam makalesinde "Her CoInitialize(nil) çağrısı bir CoUnInitialize; çağrısı ile sonlanmak zorundadır." diye belirtmişti.
Yaşayan thread'da Doğru yeremi koydum yada gereksiz yere mi koydum bilemedim.
Yardımcı olabılecek arkadaslara tesekkur ederim

procedure TForm2.JvThreadDatasetGuncelleExecute(Sender: TObject;Params: Pointer);
begin

while not JvThreadDatasetGuncelle.Terminated=true do
begin

 try
   if Adoconnection1.Connected=false then
   begin
     CoInitialize(nil);
     Adoconnection1.Connected:=true;
   end;

   if adostoredproc1.Active=false then adostoredproc1.Open
   else adostoredproc1.Requery([]);

 except
  on E: Exception do
  begin
   CoUninitialize;
   Adoconnection1.Connected:=false;
   cxMemo1.Lines.Insert(0,timetostr(now)+e.Message+' :Hata-->Tesis içindeki Araç Bilgisi Alınamıyor');
  end;
 end;

 JvThreadDatasetGuncelle.Threads[0].Sleep(1000*30);
end;

end;
Cevapla
#2
ya Exception olmazsa ?
WWW
Cevapla
#3
(07-08-2023, Saat: 17:51)yhackup Adlı Kullanıcıdan Alıntı: ya Exception olmazsa ?

Haklısınız üstad. Öncelikle bu çağrıları (CoInitialize ve CoUninitialize) niye yapıyoruz anlamak lazımki yerine karar verelim.
internette net, tatmin edici bir cevap bulamadım.
Cevapla
#4
https://learn.microsoft.com/tr-tr/window...dfrom=MSDN
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#5
Kullandığınız Thread, içinde işlettiği kodlarda COM nesneleri kullanıyor ise; CoInitialize/CoUnInitialize çağrımlarını yapmalısınız. Ancak hiç bir COM nesnesine erişim yapmadığınızdan emin iseniz kullanmayabilirsiniz. (ADO kendi içinde COM nesnelerine erişim yapıp kullanıyor, bu nedenle kullanmalısınız.)

Ancak, belirtmek isterim ki; kodunuz yine hatalı. Çünkü her bir thread kendi içinde kendisine has bir Connection nesnesi kullanmalıdır. Thread programlama paralel işlem yapmanıza imkan verdiği için DataModule, Form vb ya da global ortak kullanımda olan bir Connection'un aynı anda kullanılabilme riski vardır.

Örneğin sizin oluşturduğunuz bir thread aynı Connection nesnesi üzerinden uzun süren bir raporu çekerken, kullanıcı uygulamanızın ana threadi üzerinden aynı Connection vasıtası ile kayıt güncelleme işlemi yapmak isterse sizce ne olur ?

Bu nedenler ile, her Thread kendi içinde bir Connection açmalıdır. Ancak bu noktada şunu da ifade etmekte yarar var, Thread oluşturmak, Connection oluşturmak bunların hepsi maliyetli yani zaman alan işlemlerdir. Bu nedenler ile Thread pool ya da Connection pool kavramları hayat bulmuştur. Bu kavramları da incelemek büyük fayda sağlayacaktır.

Ayrıca belirtmekte büyük fayda görüyorum; Thread kodlarınız içinden VCL/FMX vb görsel kontrollerinize erişip kullanmamalısınız. Onları senkronize etmelisiniz ya da TThread sınıfının Synchronize ya da çok daha iyisi Queue metodlarını kullanmalısınız.

Not: TThread.Synchronize deadlock yaşamanıza imkan sunarken, Queue ile bu sıkıntıyı bertaraf edebilirsiniz. Bu hususla alakalı da TThread.Queue için yazmış olduğum bir kısım önemli konu başlıkları mevcut yeri gelmişken onları da okumanızda büyük fayda görüyorum.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
@Tuğrul HELVACI hocam çok teşekkür ederim önerilerinizi dikkate alacağım çok faydalı oldu.
Cevapla
#7
(17-08-2023, Saat: 20:11)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Çünkü her bir thread kendi içinde kendisine has bir Connection nesnesi kullanmalıdır. 

Evet acı bir tecrübe ile öğrenmiştim Big Grin
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  kod timer icinde bir kere islesin sadikacar60 5 299 30-04-2024, Saat: 17:22
Son Yorum: sadikacar60
Sad Tabsheet içinde Form Create, Close olayları YILDIRIMBEY 0 281 24-08-2023, Saat: 17:26
Son Yorum: YILDIRIMBEY
  Thread Socket (Yardım) hkeskin 1 1.434 11-07-2023, Saat: 12:47
Son Yorum: delphiman
  RESTRequest Nesnesinde Body içinde JSON Gönderme Hk. pro_imaj 2 628 04-06-2023, Saat: 00:47
Son Yorum: pro_imaj
  CoInitialize oluşturma hatası Bay_Y 2 636 20-02-2023, Saat: 16:20
Son Yorum: Bay_Y



Konuyu Okuyanlar: 1 Ziyaretçi