PDA

View Full Version : خطای زمان اجرا



Mahdi_Delphi
پنج شنبه 20 مهر 1385, 20:51 عصر
سلام

من یه برنامه برای ثبت عکس از مانیتور نوشتم که هر n ثانیه یکبار یک عکس BMP از دسکتاپ گرفته و روی هارد ذخیره کنه.البته فقط mعکس قابل ذخیره سازی هست یعنی وقتی تعداد عکس ها از m بیشتر شد جای عکس های قبلی ذخیره میشه و اونها از بین میرن.

ولی با یک مشکل مواجه شدم. بعد چند ساعت که برنامه کار میکنه بعد خطا میده و هر n ثانیه یک پیغام خطا به شکل زیر ظاهر میشه:

http://img.majidonline.com/pic/44756/RunTime_Error.JPG

اسم برنامه Services هست.

از این تابع هم برای گرفتن اسکرین شات استفاده میکنم:


function GetScreenShot: TBitmap;
var
Desktop: HDC;
c:Tcanvas;
h:Thandle;
begin
Result := TBitmap.Create;
c:=Tcanvas.Create;
h:=findwindow('progman',nil);
if(h <> 0)then
c.Handle:=h;
Desktop := GetDC(h);
try
try
Result.PixelFormat := pf24bit;
Result.Width := Screen.Width;
Result.Height :=Screen.Height;
BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY);
Result.Modified := True;
finally
ReleaseDC( h , Desktop);
end;
except
Result.Free;
Result := nil;
end;
end;

به نظر شما مشکل از کجاست ؟

ممنون

yasak5
پنج شنبه 20 مهر 1385, 23:26 عصر
سلام،
اگه debug بکنی توی کدوم خط این error رو می ده؟

mzjahromi
جمعه 21 مهر 1385, 09:21 صبح
این خطا زمانی رخ میده که سعی کنی از یک اشاره گر استفاده کنی که فضائی برای اون تخصیص نیافته است
نظر من
بین کار برنامه ات یک exceptionرخ میده و result.free انجام میشه و فضای تخصیص داده شده برای اون آزاد میشه و از اون به بعد این خطا رخ میده. توی قسمت except اون دو تا خط رو حذف کن و بذارشون یه جای مناسب تر ممکنه درست بشه

Mahdi_Delphi
جمعه 21 مهر 1385, 09:38 صبح
سلام،
اگه debug بکنی توی کدوم خط این error رو می ده؟

سلام دوست عزیز

منظورتون توی محیط خود دلفیه ؟

آخه برنامه همیشه Error نمیده فقط بعد از چند ساعت که کار میکنه این مشکل پیش میاد که مجبور میشم برنامه رو ببندم !
یعنی توی محیط دلفی نمیتونم منتظر خطا باشم چون شاید 4 ساعت یا بیشتر طول بکشه.

این پروسیجر هم موقع اجرا یعنی همون n ثانیه یکبار 35% از توان CPU رو میگیره.

ممکنه ایراد از کمبود حافظه باشه ؟!

ممنون
--------------------

این خطا زمانی رخ میده که سعی کنی از یک اشاره گر استفاده کنی که فضائی برای اون تخصیص نیافته است
نظر من
بین کار برنامه ات یک exceptionرخ میده و result.free انجام میشه و فضای تخصیص داده شده برای اون آزاد میشه و از اون به بعد این خطا رخ میده. توی قسمت except اون دو تا خط رو حذف کن و بذارشون یه جای مناسب تر ممکنه درست بشه

ببخشید .پست شما رو ندیدم ! (آخه 20 دقیقه ست صفحه جلوم بازه و دارم فکر میکنم چی بنویسم)

خیلی خیلی ممنون بایت راهمنماییتون

حتماً تست میکنم.

Mahdi_Delphi
جمعه 21 مهر 1385, 10:37 صبح
سلام

کد رو به صورت زیر دستکاری کردم ولی انگار حسابی خرابش کردم چون در عرض نیم ساعت پیغام های خطا ظاهر شدن !!


function GetScreenShot: TBitmap;
var
Desktop: HDC;
c:Tcanvas;
h:Thandle;
begin
Result := TBitmap.Create;
c:=Tcanvas.Create;
h:=findwindow('progman',nil);
if(h <> 0)then
c.Handle:=h;
Desktop := GetDC(h);
try
try
Result.PixelFormat := pf24bit;
Result.Width := Screen.Width;
Result.Height :=Screen.Height;
BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY);
Result.Modified := True;
finally
ReleaseDC( h , Desktop);
end;
Result.Free;
Result := nil;
except
;
end;
end;

میشه در مورد جای صحیح اون دو تا دستور راهمنمایی کنید ؟!

راستی چطور میشه جای BMP عکس رو به صورت Jpeg ذخیره کرد تا فضای کمتری اشغال کنه ؟!

ممنون

mzjahromi
جمعه 21 مهر 1385, 12:44 عصر
کلا این تابع یه جوریه
بیا ایجاد کردن و ازاد کردن Result رو بذار خارج از این تابع
وقتی برنامه اجرا میشه ایجادش کن و وقتی هم میخواد terminateبشه آزادش کن

Mahdi_Delphi
جمعه 21 مهر 1385, 13:01 عصر
چشم.

امتحان میکنم و نتیجه رو میگم.

ممنون