PDA

View Full Version : سوال: مشکل استفاده زیاد Ram و CPU سیستم به دلیل ایجاد صف چاپ



h.ranjbar72
شنبه 29 تیر 1398, 09:16 صبح
سلام
من یه نرم افزار مدیریت و حسابداری رستوران نوشتم
سیستم کامل بر پایه MVC پیاده سازی شده و از Multi Threading استفاده شده
یه صف چاپ ایجاد کردم که به محض اینکه یه فاکتور ثبت میشه بلافاصله درخواست چاپ در کمتر از 1 ثانیه به چندین پرینتر(شامل صندوق - سالن - آشپزخانه و...) ارسال میشه که هر کدام از پرینترها هم تنظیمات خاص خودشان را دارند

روال پیاده سازی به این شکل هستش که پس از ثبت فاکتور تمام اطلاعات مورد نیاز چاپ اعم از : اطلاعات فاکتور، محصولات فاکتور، تنظیمات پرینتر در قالب جیسون در فیلدهای یک جدول به نام PrinterQueue ذخیره میشه.

برای ارسال پرینت به چاپگر در Program.cs در کد یه تایمر با Interval 600ms ایجاد کردم که روی یک Thread مستقل از MainForm داره اجرا میشه و مدام داره کوئری sql به جدول PrinterQueue میزنه، چک میکنه اگه رکوردی در جدول وجود داشته باشه بلافاصله اطلاعات رو میخونه و جیسون های ذخیره شده رو به کلاس های مربوطه CAST میکنه و میفرسته به تابع چاپ که نوشتم. البته این تابع چاپ static نیست و به ازای هر دستور چاپ یک شی از کلاس مورد نظر ساخته میشه و سپس توسط اون شی تابع چاپ اجرا میشه. در طراحی فایل چاپ هم از StimulSoftReport استفاده شده

الان چاپ در سریع ترین زمان ممکن داره اجرا میشه ولی مشکل کار اینجاست که بعد از 1 ساعت کار کردن نرم افزار cpu تا 95% میاد , Ram هم حدود 2 گیگ میرسه

اصلا متوجه نمیشم که مشکل کار کجاست!!!
کسی اگه بتونه راهنماییم کنه ممنون میشم

farhad_shiri_ex
شنبه 29 تیر 1398, 12:02 عصر
الان چاپ در سریع ترین زمان ممکن داره اجرا میشه
ولی مشکل کار اینجاست که بعد از 1 ساعت کار کردن نرم افزار cpu تا 95% میاد , Ram هم حدود 2 گیگ میرسه

بهتره از یک ابزار Profile استفاده کنید ودر حالت دیباگ برنامه را اجرا کنید ببنید که در کدام یک از روالها که برنامه وارد میشه! بیشترین پردازش وجود داره! ویا اینکه تمام روالهایی که مربوط به چاپ هستند را تک به تک بررسی کنید، یعنی زمان ورود به یک روال وضعیت آبجکتها به چه صورت هست و در زمان خروج از روال به چه صورت هست؟ آیا نیاز هست که زودتر از موعد متد dispose را برای اجرای زودتر GC اجرا کنید؟
دوتا نکته : اول اینکه استفاده از متد dispose همیشه هم کار مناسبی نیست چرا که اجرای GC هم خودش هزینه بر هست
و دوما اینکه وقتی از نخ ها در سی شارپ استفاده میکنید باید به این نکات توجه داشته باشید Context Switch و Time dispatcher مدوامی که در حال رخ دادن در پردازشگر به وجود میاد باید دقت کنید، به همین علت معمولا استفاده از نخ های Raw توصیه نمیشه بهتره در صورت امکانات موازی سازی خود NET. مانند TPL/PLINQ استفاده کنید ویا از Thread Pool ها استفاده کنید.
به هرحال نکات فنی زیادی وجود داره به همین علت بهتر بود که سورس کدهایی که فکر میکنید دچار اشکال هستند را قرار میداید تا بهتر بشه نظر داد.
و البته کوئری زدن های مداوم هم نمیتونه بی تاثیر باشه به این علت که نوشتن خود کوئری هم نقش بسزایی در استفاده از منابع را داره!
برای ارسال فوری گزارشات چاپی روشهای بهتری هم میتونه تعبیه بشه!
مثال چاپ این قبیل گزارشات را محول کنید به خود SQL Server یعنی یک Job Service بنویسید که در سمت پایگاه داده فعال باشه و به محض دریافت گزارش جدید اقدام به چاپ کنه حالا حتی اگر چاپ گزارش را هم محول کنید به SSIS-Report Service که بازدهی بیشتر هم خواهد شد این یکی از روشهای برنامه نویسی توزیع شده هست! حتما که نباید همه پردازش ها را خودتون در نرم افزار اصلی انجام بدید!