Kanallar ve akıl sağlığım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Kanallar ve akıl sağlığım

Mesaj gönderen Akin_Delphi »

Arkadaşlar,

Geliştirmekte olduğum bir uygulamayı kanallı hale getirdim. Ancak senkronizasyon problemi yaşıyorum ve bütün bildiğim teknikleri kullanmama rağmen, bir türlü bu işin içinden çıkamadım.

Öncelikle birtane ana kanalda (yani formda) tanımlı bir bitmapim var.

Kod: Tümünü seç

var
ABitmap : TBitmap;
Şimdi bu bitmap'in içeriğine hem ana kanaldan (yani formdan) hem de iki ayrı kanaldan ulaşıyorum.

Mutekslerden tutunuz da semaforlara, kritikbölümlere kadar her şeyi denedim ancak bu global bitmap'in içeriğini kanallardan birine aktarmaya çalıştığımda bazen tayin işlemi sonuç vermiyor ve ana kanal dahil tüm kanallar beklemeye geçiyor. Program kilitli değil, ancak hepsi suspended konumuna geçtiği için kapatamıyorum ve yapması gereken işlemi de yapmıyor.

Bu global Abitmap'i hem ana kanaldaki hem de threadlerdeki başka bitmaplere tayin etmek için aşağıdaki gibi bir prosedürüm var. Bu prosedür form içerisinde bulunduğu gibi, aynı kodu içeren karşılık gelen prosedürleri de kanallar içerisinde bulunmakta.

Kod: Tümünü seç

procedure Form1.BitMaplariAktar(Const KaynakBitmap: TBitmap; var HedefBitmap : TBitmap);
begin
try
While KaynakBitmap.Canvas.LockCount > 0 do
begin
KaynakBitmap.Canvas.Unlock;
{$IFDEF MEMPROOF}
OutputDebugString('Kaynabitmap Kanvas Kilitliymiş');
{$ENDIF}
end;
While HedefBitmap.Canvas.LockCount > 0 do
begin
HedefBitmap.Canvas.Unlock;
{$IFDEF MEMPROOF}
OutputDebugString('HedefBitmap Kanvas Kilitliymiş');
{$ENDIF}
end;
  try
    If (KaynakBitmap.Canvas.TryLock)
    and (HedefBitmap.Canvas.TryLock) then
    begin
    HedefBitmap.Assign(KaynakBitmap);
    end;
  except
  HedefBitmap.Canvas.Unlock;
  KaynakBitmap.Canvas.Unlock;
  end;
finally
HedefBitmap.Canvas.Unlock;
KaynakBitmap.Canvas.Unlock;
end;
end;
Ana kanalda bu tayin işlemini gerçekleştirirken bir sorun yok. Ancak kanallardan birisi uzun süre çalıştıktan sonra bu prosedüre karşılık gelen kendi içerisinde tanımlı prosedürü çağırdığında sorun oluyor.

Neyi yanlış yapıyorum, anlamadım. Tabiri caizse kafayı yemek üzereyim.
Saygılar ve Şimdiden Teşekkürler.

Önemli Not : İşin garip tarafı eğer kod içerisinde hata ayıklama (debug) bilgilerini bırakırsam, kanallar kilitlenmiyor. Ancak hata ayıklama bilgilerini çıkarttığımda bu sorun meydana geliyor.
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Mesaj gönderen Akin_Delphi »

Sanırım sorunu buldum:

Bitmap'in hem Lock prosedürü hem de Assign prosedürü kritik bölümler kullanıyormuş :shock: :shock:

Dolayısıyla ben hem kaynak bitmap'i hem de hedef bitmap'i Lock ederek kritik bölümlere girmesini sağlıyorum. Assign deyince tekrar bir kritik bölüme daha giriyor.

Ve de düşünün bu lock ve assign çağrılarından önce de ben muteksleri kullanıp kodu daha da kitlenebilir hale getiriyorum. :oops: :oops:

Neyse bu bir tecrübe.
Saygılarımla,
Cevapla