dosya meşgul hatası
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
dosya meşgul hatası
Kolay gelsin üstatlar.
iki adet proses yazdım biri bitmap oluşturup kapatıyor diğeri bu bitmap alıp okuyup kapatıyor.
bir günlük çalışmada yaklaşık 10 defa çakışıyor. Dosya meşgul hatası veriyor bunu engellemenin bir yolu varmıdır. dosya meşgul ise diğer prosese bekle diyeceğim.
Şimdiden teşekkürler
iki adet proses yazdım biri bitmap oluşturup kapatıyor diğeri bu bitmap alıp okuyup kapatıyor.
bir günlük çalışmada yaklaşık 10 defa çakışıyor. Dosya meşgul hatası veriyor bunu engellemenin bir yolu varmıdır. dosya meşgul ise diğer prosese bekle diyeceğim.
Şimdiden teşekkürler
Re: dosya meşgul hatası
Merhaba,
Kullandığınız Delphi sürümü nedir?
Bitmap oluşturan proses dosyaya nasıl yazıyor?
Bitmap okuyan proses dosyadan nasıl okuyor?
Kod paylaşabilir iseniz yardımcı olmak mümkün olabilir.
Kullandığınız Delphi sürümü nedir?
Bitmap oluşturan proses dosyaya nasıl yazıyor?
Bitmap okuyan proses dosyadan nasıl okuyor?
Kod paylaşabilir iseniz yardımcı olmak mümkün olabilir.
Re: dosya meşgul hatası
bitmap oluşturan proses kodu:
bitmap okuyan proses kodu
Kod: Tümünü seç
procedure TForm1.Button3Click(Sender: TObject);
var
it,jt : integer;
bmp: TBitMap;
r : Trect;
begin
try
bmp := TBitmap.Create;
// bmp.Width := Image5.Width;
// bmp.Height := Image5.Height;
bmp.Width := 1000;
bmp.Height := 210;
bmp.PixelFormat := pf24bit;
r := Rect(0, 0, bmp.Width, bmp.Height);
bmp.Canvas.StretchDraw(r, Image1.Picture.Graphic);
bmp.SaveToFile('C:\silim_setup\resim13.bmp');
image2.Picture.LoadFromFile('C:\silim_setup\resim13.bmp');
finally
end;
bmp.Free;
end;
Kod: Tümünü seç
procedure TForm4.Button17Click(Sender: TObject);
var
it,jt : integer;
bmp,resimilk, resimson : TBitMap;
r : Trect;
begin
try
bmp := TBitmap.Create;
// bmp.Width := Image5.Width;
// bmp.Height := Image5.Height;
bmp.Width := 1000;
bmp.Height := 210;
bmp.PixelFormat := pf24bit;
// r := Rect(0, 0, bmp.Width, bmp.Height);
// bmp.Canvas.StretchDraw(r, Image5.Picture.Graphic);
// bmp.SaveToFile('C:\silim_setup\resim13.bmp');
image2.Picture.LoadFromFile('C:\silim_setup\resim13.bmp');
finally
end;
bmp.Free;
end;
Re: dosya meşgul hatası
Merhaba,
Kullanıcı çok uğraşsa dahi buton tıklamasını o kadar hızlı yapıp bitmap dosya yazma işlemi bitmeden okuma butonunu tıklayamaz diye düşünüyorum.
Ancak, işletim sistemi birçok dosya işlemini "cache" kullanarak yaptığı için yazılan dosya diske gerçekten yazılması anında değil gecikmeli olabilir.
Aşağıdaki kod dosyanın kullanılabilir olduğunu kontrol edip işlemin devam etmesini sağlıyor. Eğer sorun yukarıdaki gibi "cache" kaynaklı ise sorunu çözmesi gerekir.
Paylaştığınız kod ile ilgili olarak. Nesneleri create edip hafıza kaçağına sebep olmamak için free etme kodunuz oldukça hatalı.
Bir nesneyi aşağıdaki şekilde create etmemelisiniz.
Eğer nesne create edilemez ise sizin kodunuz free etmeye çalışır ve bu access violation hatasına sebep olur (oluşturulmamış bir nesne free edilemez). Doğrusu şöyle olmalı:
Bunun dışında aşağıdaki kodunuz da hatalı:
Burada try..finally bloğu dışında bmp nesnesini free etmişsiniz. Eğer try ile finally arasındaki kod bir hata oluşturur ise bmp nesnesi free edilmeyip hafıza kaçağı oluşacaktır. Doğrusu şöyle olmalı:
Bazı durumlarda aynı prosedür/fonksiyon içinde birden fazla nesne oluşturup hafıza kaçağı kontrolü yapılması gerekir. Nesne sayısı arttıkça try..finally blok sayısı da artacağı ve kod okunabilirliğini etkileyeceği gibi olumsuzlukların önüne geçmek ve aynı zamanda hafıza kaçağına sebep olmamak için aşağıdaki gibi bir kullanım tercih edilebilir:
Kullanıcı çok uğraşsa dahi buton tıklamasını o kadar hızlı yapıp bitmap dosya yazma işlemi bitmeden okuma butonunu tıklayamaz diye düşünüyorum.
Ancak, işletim sistemi birçok dosya işlemini "cache" kullanarak yaptığı için yazılan dosya diske gerçekten yazılması anında değil gecikmeli olabilir.
Aşağıdaki kod dosyanın kullanılabilir olduğunu kontrol edip işlemin devam etmesini sağlıyor. Eğer sorun yukarıdaki gibi "cache" kaynaklı ise sorunu çözmesi gerekir.
Kod: Tümünü seç
uses
DateUtils;
function WaitForFileReady(const FileName: string; const Timeout: Cardinal): Boolean;
var
FileHandle: THandle;
StartTime: TDateTime;
begin
StartTime := Now();
while (MilliSecondsBetween(Now, StartTime) < Timeout) or (Timeout = 0) do
begin
FileHandle := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (FileHandle <> INVALID_HANDLE_VALUE) then
begin
CloseHandle(FileHandle);
Exit(True);
end;
Sleep(50);
end;
Exit(False);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Bmp: TBitMap;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := 1000;
Bmp.Height := 210;
Bmp.PixelFormat := pf24bit;
// Maksimum 1 saniye dosyanın kullanılabilir olmasını bekle.
// Eğer dosya o anda kullanılabilir ise işlem hemen devam eder.
// İhtiyaca göre süre uzatılabilir.
if WaitForFileReady('C:\silim_setup\resim13.bmp', 1000) then
begin
Image2.Picture.LoadFromFile('C:\silim_setup\resim13.bmp');
end
else
begin
ShowMesage('Dosya yok veya kullanılabilir değil!');
end;
finally
bmp.Free();
end;
end;
Bir nesneyi aşağıdaki şekilde create etmemelisiniz.
Kod: Tümünü seç
try
bmp := TBitmap.Create;
Kod: Tümünü seç
bmp := TBitmap.Create;
try
Kod: Tümünü seç
finally
end;
bmp.Free;
Kod: Tümünü seç
finally
bmp.Free();
end;
Kod: Tümünü seç
var
Bitmap1: TBitmap;
Bitmap2: TBitmap;
Bitmap3: TBitmap;
begin
Bitmap1 := nil;
Bitmap2 := nil;
Bitmap3 := nil;
try
Bitmap1 := TBitmap.Create();
Bitmap2 := TBitmap.Create();
Bitmap3 := TBitmap.Create();
// burada normal şekilde işlemler yapılabilir.
finally
Bitmap1.Free();
Bitmap2.Free();
Bitmap3.Free();
end;
Re: dosya meşgul hatası
Cevabınız için teşekkür ederim.
Aynı program içinde iki farklı buton değil hocam. İki farklı programdaki butonlar. programın biri haberleşme ile verileri çekip resmi oluşturuyor diğeri bu resmi okuyor.
Kod yazmadaki hatalarım için verdiğiniz tavsiyeler içinde teşekkür ederim hocam
Aynı program içinde iki farklı buton değil hocam. İki farklı programdaki butonlar. programın biri haberleşme ile verileri çekip resmi oluşturuyor diğeri bu resmi okuyor.
Kod yazmadaki hatalarım için verdiğiniz tavsiyeler içinde teşekkür ederim hocam
Re: dosya meşgul hatası
Kolay gelsin Üstad
vermiş olduğunuz fonksiyonun her iki projemede uyguladım.
Denedim olmadı
Cannot open file "C:\silim_setup\resim13.bmp".
The process cannot access the because it is begin used by another process.
bu hata arada devam ediyor. başka yöntem varmıdır acaba
vermiş olduğunuz fonksiyonun her iki projemede uyguladım.
Denedim olmadı
Cannot open file "C:\silim_setup\resim13.bmp".
The process cannot access the because it is begin used by another process.
bu hata arada devam ediyor. başka yöntem varmıdır acaba
Re: dosya meşgul hatası
resmi oluşturan kod
resmi okuyan kod
Kod: Tümünü seç
procedure TForm1.Button3Click(Sender: TObject);
var
bmp: TBitMap;
r : Trect;
begin
bmp := TBitmap.Create;
try
bmp.Width := 1000;
bmp.Height := 210;
bmp.PixelFormat := pf24bit;
if WaitForFileReady('C:\silim_setup\resim13.bmp', 1000) then
begin
r := Rect(0, 0, bmp.Width, bmp.Height);
bmp.Canvas.StretchDraw(r, Image1.Picture.Graphic);
bmp.SaveToFile('C:\silim_setup\resim13.bmp');
image2.Picture.LoadFromFile('C:\silim_setup\resim13.bmp');
end
else
begin
ShowMessage('Dosya okuma hatası !!!');
end;
finally
bmp.Free;
end;
end;
Kod: Tümünü seç
procedure TForm4.Button17Click(Sender: TObject);
var
it,jt : integer;
bmp,resimilk, resimson : TBitMap;
r : Trect;
begin
bmp := TBitmap.Create;
try
bmp.Width := 1000;
bmp.Height := 210;
bmp.PixelFormat := pf24bit;
if WaitForFileReady('C:\silim_setup\resim13.bmp', 1000) then
begin
Image2.Picture.LoadFromFile('C:\silim_setup\resim13.bmp');
end
else
begin
ShowMessage('Dosya okuma hatası !!!');
end;
finally
bmp.Free;
end;
end;
Re: dosya meşgul hatası
Merhaba,
Dosya okuma kodunuzu aşağıdaki hale getirdiğiniz zaman aldığınız hata mesajını görüntü olarak paylaşabilir misiniz?
Dosya okuma kodunuzu aşağıdaki hale getirdiğiniz zaman aldığınız hata mesajını görüntü olarak paylaşabilir misiniz?
Kod: Tümünü seç
var
it, jt: integer;
bmp, resimilk, resimson: TBitMap;
r: Trect;
begin
bmp := TBitMap.Create;
try
bmp.Width := 1000;
bmp.Height := 210;
bmp.PixelFormat := pf24bit;
if WaitForFileReady('C:\silim_setup\resim13.bmp', 1000) then
begin
try
Image2.Picture.LoadFromFile('C:\silim_setup\resim13.bmp');
except
on E: Exception do
begin
ShowMessage('HATA: Dosya okunamadı: C:\silim_setup\resim13.bmp' + sLineBreak +
'Orjinal Hata: ' + E.Message);
end;
end;
end
else
begin
ShowMessage('Dosya okuma hatası !!!');
end;
finally
bmp.Free;
end;
end;
Re: dosya meşgul hatası
Benim bu tür asenkron durumlar için kullandığım basit bir yöntem denemekte fayda var
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
err:Boolean=false;
begin
repeat
try
// Yazma Okuma Fonksiyonu
image1.Picture.Bitmap.SaveToFile('C:\deneme.png');
// Yazma Okuma Fonksiyonu Sonu
err:=false;
caption:=timetostr(time) + ' Zamanında Yazıldı / Okundu ' ;
except
err:=true;
caption:= ' Hata Oluştu ' ;
end;
Application.ProcessMessages;
until not err;
end;
Kalk ve işe yarar bir şey yap! Çünkü Allah (c.c.) yeniden başlayanların yardımcısıdır.
Re: dosya meşgul hatası
// Yazma Okuma Fonksiyonu
// Yazma Okuma Fonksiyonu Sonu
Aralıklarına kullanıcı kendi kontrollerini koyabilir.
Ben kendi uygulamalarında yöntemi ile zaman kontrolü yapmaktayım işlem sonunda (Threadlarda farklı yöntemler uyguluyorum) ile de uygulamanın sürekli aktif olmasını sağlıyorum.
// Yazma Okuma Fonksiyonu Sonu
Aralıklarına kullanıcı kendi kontrollerini koyabilir.
Ben kendi uygulamalarında
Kod: Tümünü seç
GetTickCount64
Kod: Tümünü seç
Application.ProcessMessages
Kalk ve işe yarar bir şey yap! Çünkü Allah (c.c.) yeniden başlayanların yardımcısıdır.
Re: dosya meşgul hatası
hata kodu bu hocam sabahtan beri çelışıyor 4 defa hata verdi
hata aynı hata
Cannot open file "C:\silim_setup\resim13.bmp".
The process cannot access the because it is begin used by another process.
hata aynı hata
Cannot open file "C:\silim_setup\resim13.bmp".
The process cannot access the because it is begin used by another process.
- Dosya ekleri
-
- hata3 (1).jpg (1.48 KiB) 2412 kere görüntülendi
Re: dosya meşgul hatası
s.a. üstad
proğramları sabaha kadar çalıştırdım yazma yapan proğram 7 defa aynı hatayı vermiş
okuma yapan proğram
aşağıdaki hatayı vermiş
HATA: Dosya okunamadı: C:\silim_setup\resim13.bmp
Orjinal Hata : Cannot open file "C:\silim_setup\resim13.bmp".
The process cannot access the file because it is being used by another process
proğramları sabaha kadar çalıştırdım yazma yapan proğram 7 defa aynı hatayı vermiş
okuma yapan proğram
aşağıdaki hatayı vermiş
HATA: Dosya okunamadı: C:\silim_setup\resim13.bmp
Orjinal Hata : Cannot open file "C:\silim_setup\resim13.bmp".
The process cannot access the file because it is being used by another process
- Dosya ekleri
-
- Screenshot_1.jpg (1.89 KiB) 2402 kere görüntülendi