Thread

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Thread

Mesaj gönderen pasa_yasar »

Mrb.

Basit bir thread yaptım.

Kod: Tümünü seç

unit Unit1;
.
.
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Taktarimthread = class (TThread)

  protected
      Procedure Execute ; override;
  end;

.
.
// threadı çalıştıracak alan. Button tıklayınca thread alanına gidiyor ve çalıştırıyor.
procedure TForm1.Button258Click(Sender: TObject);
var
    NewThread: Taktarimthread;
begin

    NewThread:=Taktarimthread.Create(False);

end;

// Thread İşlemi Belge var ise hangi belge ise ilgili alana gidip o belgeden bilgi alıyor.  Kasa belgesi ise firma, ticari belge ticari kart gibi
// ağdan gelen belgeleri kontrol edip tasnifliyor. 
// Şu anda button tıklayarak test ediyorum bittiğin threadtimer ile  3 - 5 sn bir kontrol ettirmeyi planlıyorum hata vermez ise :)

procedure Taktarimthread.execute;
begin

   FreeOnTerminate:=True;

   if  (Form1.DonguLocalQuery6.RecordCount > 0)  then
   begin

        case Form1.DonguLocalQuery6.FieldByName('grup').AsInteger of
              1  : Form1.firma;
              2  : Form1.ticarikart;
              3  : Form1.stok;
              4  : Form1.banka;
         end;

Sorum :
1. thread yapısı düzgün mü acaba.
2. Gönderdiğim alanlar için ayrıca thread yazmalımıyım. Form1.Firma için ayrı Form1.ticarikart için ayrı threadlar. Gönderdiğim alandaki işlemlerde threada dahil olurmu.

3. Arada bir hata veriyor. RestoreDC Fails hatası. durduruğumda aşağıdaki alana gidiyor. Cxgrid olduğu alanı kapatınca boş sayfada thread çalıştırınca hata vermiyor. CXgridtableview ile ilgili bir grafik hatası oluşuyor thread sonra ama neden bilmiyorum. Bir yerde çakışıyor mu acaba.

Kod: Tümünü seç

Unit CxGraphics;
.
.
procedure TcxCanvas.RestoreDC;
begin
  dxTestCheck(Length(FSavedDCs) > 0, 'RestoreDC fails');
  if Length(FSavedDCs) > 0 then
  begin
    Canvas.Handle := FSavedDCs[High(FSavedDCs)].Handle;
    dxTestCheck(Windows.RestoreDC(Handle, FSavedDCs[High(FSavedDCs)].State), 'RestoreDC fails');
    SetLength(FSavedDCs, Length(FSavedDCs) - 1);
    Canvas.Unlock;
  end;
end;
Thread yapacağı işe belli aralıklarla ağdan gelen kayıtları sorgulayacak ve evrak grubuna göre alana işleyecek. Bu belge geldi diye.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Thread

Mesaj gönderen pasa_yasar »

Hata Thread arasında veritabanı güncellemede oluyor. Sorunun kaynağını buldum. Güncellediği kaydı görünmesi için thread içindeki iken UniQuery1.RefResh komutu gönderiyorum. Güncelleme sırasında RestoreDC Fails , Division by zero Cxgridtableview hatası veriyor.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Thread

Mesaj gönderen mkysoft »

Thread içinde grid gibi genel erişime açık nesneleri kullanmak risklidir. Eriştiğiniz nesnlerin thread safe olduğundan emin olmanız lazım. Şöyle örnekleyeyim; thread'den 100 tane paralel olarak çalıştırdığınızda hepsi aynı anda aynı nesneye erişmeye çalışarak işlem yapacaktır. Bu işlem esnasında farklı threadler aynı bellek adresine okuma/yazma yaptığı için accsess voladation hatası almanız çok büyük bir ihtimal.

Thread ile thread'in synchronize tekniğini kullanarak nesnelere erişmeni güvenli olan yol olacaktır.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Thread

Mesaj gönderen pasa_yasar »

tüm alanları güncellemek yerine sadece tek kaydı güncelleyebilirmiyim acaba aradım bulamadım. sql ile xxx ID kaydı güncelle veya delphi komut ile. Devart Unidac kullanıyorum. UniQuery UpdateCursor falan kullanıyorum ama onun için kaydının aktif veya seçili olması gerekiyor.
Cevapla