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;
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;
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.