ferankyy
یک شنبه 20 فروردین 1391, 14:04 عصر
با سلام خدمت اساتید
من یه برنامه چاپ کارت نوشتم که با 18 پرینتر کار می کند . یعنی وقتی برنامه اجرا میشه اطلاعات از بانک اطلاعاتی دریافت و سپس این اطلاعات به عکس تبدیل شده و با استفاده از دستورات خود پرینتر به پرینتر ها ارسال میشه ( در ضمن برنامه برای چاپ کارت PVC هست و پرینتر های مخصوص داره ) این کار بر اساس تعداد رکورد های بانک اطلاعاتی تکرار میشه و بین پرینتر ها تقسیم میشود . مشکل اینجاست که وقتی تعداد چاپ ها به حدود 500 تا 600 عدد میرسه برنامه ارور System Out Of Memory میده و باید برنامه حتما بسته بشه و دوباره باز بشه تا شروع به کار کنه .
در ابتدا فکر کردم که به خاطر این هست که چون هر بار که رکورد از دیتابیس دریافت میشه ، اطلاعات اون به عکس تبدیل میشه و کنار برنامه ذخیره میشه و به پرینتر ارسال میشه و دوباره پاک میشه . و برای حل مشکل تمامی دستوراتی که برای خواندن و ذخیره عکس روی هارد بود را با استفاده از Using انجام دادم که بعد از پایان هر پرینت از بین بروند . ولی بازم این مشکل به وجود آمد و به این نتیجه رسیدم که هر اتفاقی میفته داخل SDK خود پرینتر هست که این عکس ها رو برای چاپ بهش میفرستم ( در ضمن این پرینتر ها برای اینکه بتونه با دستورات خودش رنگی چاپ کنه باید ابتدا آدرس عکس سیاه و سفید اطلاعات و سپس آدرس عکس خود فرد را به یه تابع که داخل DLL چاپ هست بفستیم و اون عملیات چاپ رو انجام میده ) و به همین دلیل اون قسمت از دستورات که آدرس عکس ها رو برای چاپ به SDK میداد رو حذف کردم ( یعنی در واقع دستوری برای چاپ به پرینتر ها ارسال نمیشد و فقط برنامه رکورد ها را از بانک دریافت ، عکس ها رو ساخته و روی هارد ذخیره میکرد و دوباره پاک میکرد ) برنامه رو اجرا کردم و دیگه اون ارور صادر نشد . و به این نتیجه رسیدم که وقتی آدرس عکس ها رو برای چاپ به SDK میدیم بعد از 500 تا 600 بار ارسال برنامه ارور System Out Of Memory میده . بعد با استفاده از ابزار Reflactor کد های SDK رو گرفتم و کلاسی که با عکس کار میکرد رو از IDispsable ارث بری کردم که بتونم SDK رو با استفاده از Using فراخونی کنم که در پایان چاپ از حافظه خارج بشه ولی بازم نشد . در ضمن داخل اون SDK آدرس عکس ها به یه تابع که مثل توابع API بود ارسال میشد و سپس عکس ها تبدیل به Byte و به پرینتر ارسال میشدند . همچنین داخل SDK از دستور Marshal.Copy() استفاده شده بود که یکی از پارمتر های ورودی این تابع ، عکسی بود که به بایت تبدیل شده بود .
(برای هر پرینتر یک BackgroundWorker ساخته میشه و شروع به کار میکنه)
دوستان لطفا کمک کنید .
من یه برنامه چاپ کارت نوشتم که با 18 پرینتر کار می کند . یعنی وقتی برنامه اجرا میشه اطلاعات از بانک اطلاعاتی دریافت و سپس این اطلاعات به عکس تبدیل شده و با استفاده از دستورات خود پرینتر به پرینتر ها ارسال میشه ( در ضمن برنامه برای چاپ کارت PVC هست و پرینتر های مخصوص داره ) این کار بر اساس تعداد رکورد های بانک اطلاعاتی تکرار میشه و بین پرینتر ها تقسیم میشود . مشکل اینجاست که وقتی تعداد چاپ ها به حدود 500 تا 600 عدد میرسه برنامه ارور System Out Of Memory میده و باید برنامه حتما بسته بشه و دوباره باز بشه تا شروع به کار کنه .
در ابتدا فکر کردم که به خاطر این هست که چون هر بار که رکورد از دیتابیس دریافت میشه ، اطلاعات اون به عکس تبدیل میشه و کنار برنامه ذخیره میشه و به پرینتر ارسال میشه و دوباره پاک میشه . و برای حل مشکل تمامی دستوراتی که برای خواندن و ذخیره عکس روی هارد بود را با استفاده از Using انجام دادم که بعد از پایان هر پرینت از بین بروند . ولی بازم این مشکل به وجود آمد و به این نتیجه رسیدم که هر اتفاقی میفته داخل SDK خود پرینتر هست که این عکس ها رو برای چاپ بهش میفرستم ( در ضمن این پرینتر ها برای اینکه بتونه با دستورات خودش رنگی چاپ کنه باید ابتدا آدرس عکس سیاه و سفید اطلاعات و سپس آدرس عکس خود فرد را به یه تابع که داخل DLL چاپ هست بفستیم و اون عملیات چاپ رو انجام میده ) و به همین دلیل اون قسمت از دستورات که آدرس عکس ها رو برای چاپ به SDK میداد رو حذف کردم ( یعنی در واقع دستوری برای چاپ به پرینتر ها ارسال نمیشد و فقط برنامه رکورد ها را از بانک دریافت ، عکس ها رو ساخته و روی هارد ذخیره میکرد و دوباره پاک میکرد ) برنامه رو اجرا کردم و دیگه اون ارور صادر نشد . و به این نتیجه رسیدم که وقتی آدرس عکس ها رو برای چاپ به SDK میدیم بعد از 500 تا 600 بار ارسال برنامه ارور System Out Of Memory میده . بعد با استفاده از ابزار Reflactor کد های SDK رو گرفتم و کلاسی که با عکس کار میکرد رو از IDispsable ارث بری کردم که بتونم SDK رو با استفاده از Using فراخونی کنم که در پایان چاپ از حافظه خارج بشه ولی بازم نشد . در ضمن داخل اون SDK آدرس عکس ها به یه تابع که مثل توابع API بود ارسال میشد و سپس عکس ها تبدیل به Byte و به پرینتر ارسال میشدند . همچنین داخل SDK از دستور Marshal.Copy() استفاده شده بود که یکی از پارمتر های ورودی این تابع ، عکسی بود که به بایت تبدیل شده بود .
(برای هر پرینتر یک BackgroundWorker ساخته میشه و شروع به کار میکنه)
دوستان لطفا کمک کنید .