# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi > سوال: سوال در مورد زمان بندی برای تهیه فایل پشتیبان

## سیروس مقصودی

با سلام

 من میخواهم در برنامه ام فرمی طراحی کنم که در آن کاربر ساعت شروع تهیه فایل پشتیبان را وارد کند و برنامه در همان ساعت تعیین شده توسط کاربر , شروع به تهیه فایل پشتیبان نماید .
من نمیخواهم در برنامه Timer بگذارم که در هرلحظه ساعت را در  Timer  چک بکنم . این کار باعث کندی برنامه میشود آیا زاه حل دیگری وجود دارد ؟

با تشکر فراوان

----------


## hamid-nic

> با سلام
> 
>  من میخواهم در برنامه ام فرمی طراحی کنم که در آن کاربر ساعت شروع تهیه فایل پشتیبان را وارد کند و برنامه در همان ساعت تعیین شده توسط کاربر , شروع به تهیه فایل پشتیبان نماید .
> من نمیخواهم در برنامه Timer بگذارم که در هرلحظه ساعت را در  Timer  چک بکنم . این کار باعث کندی برنامه میشود آیا زاه حل دیگری وجود دارد ؟
> 
> با تشکر فراوان


اگر از sql استفاده می کنید این کار را به job ها در sql server بسپارید .

----------


## سیروس مقصودی

با تشکر 

آیا میتوان وظیفه کار job ها رو بوسیله کد نویسی در داخل برنامه خود شبیه سازی نمود

----------


## یوسف زالی

کوئری اس کیو ال مربوط بهش رو بنویسید و مثل کوئری های معمولی ران کنید.

----------


## ابوالفضل عباسی

باسلام
از تایمر استفاده کن اگر internal تایمر رو 1000 بدهید هر 1 ثانیه عمل میکنه و برنامه هنگ و کند نمیشه،ولی اگر قراره در تایمر بجز زمان فرمان دیگری اجرا بشه،کافیست در ontime تایمر،یکبار تایمر رو False کنید و در پایان تمامی دستورات تایمر رو true کنید.این طوری فرمان های تایمر بهم تداخل پیدا نمیکنه.
اما اگر فقط این تایمر قراره یک ثانیه،یک ثانیه زمان بدهد نیازی به True,false نیست.

----------


## یوسف زالی

یعنی واقعا شما این کار رو می کنید؟  :متعجب:  :متعجب:  :متعجب: 
مثلا یکی از مشتریان ما دیتابیس 12 گیگی داره که برای این مدل کار ها خیلی عادیه، تنها پروسه بکاپ گیری یکی دو دقیقه طول می کشه، و در این مدت تمام کانکشن ها wait می شند، با راهکار شما کلا در شرکت باید تخته بشه!

بهترین کار استفاده از جابه. در موردش تحقیق کنید.

----------


## ابوالفضل عباسی

من خودم به شخصه این کار رو نمی کنم.
چون تایمر کلا برنامه رو کند میکنه،ولی وقتی قراره از بانک اطلاعاتیم پشتیبان بگیرم تایمر رو روی 30 دقیقه(بطور دستی از طریق یک edit) یا بیشتر تنظیم میکنم تا بکاپ بگیره .
من این راه حل رو گفتم چون فکر کردم کارشون سبکه،وگرنه این راه حل خوبی نیست.
تا الان کاربرانی که برنامه ام رو دارند با مشکلی دررابطه با پشتیبان گیری براساس دقیقه برنخورده اند.بعضی هاشون دیتاهای سنگینی دارند و کل زمان پشتیبان گیری بیشتر از 2 دقیقه نمیشه

----------


## یوسف زالی

اگر برنامه کلاینت کمتر از 30 دقیقه کار کنه چی؟
یا کلا به هر دلیلی در روزهای خاصی کمتر از اینتروال کار کنه؟
کلا استفاده از راههای این شکلی علمی نیست.
اگر این طوره، بهتره دکمه ای برای کاربر بگذارید که خودش بره بکاپ بگیره، یا این که آلارم بده وقت بکاپه، می خوای بگیرم یا نه.
از طرفی اگر کلاینت ها زیاد باشن، مثلا سی تا، سرور بیچاره باید در هر دقیقه یک بکاپ بده. تازه این در حالیه که خوشبینانه زمان رو تقسیم کرده باشیم. در بهترین حالت برای این مثال سرور می خوابه.

----------


## سیروس مقصودی

با تشکر از همه دوستان 

من در برنامه ام منویی گذاشته ام که هروقت کاربر خواست , بتواند با استفاده از آن منو فایل پشتیان را تهیه نماید . ولی مدیر شرکت از من خواسته که برنامه ای طراحی کنم که کاربران با پشتیبان گیری کاری نداشته باشند و مدیر شرکت زمانی را برای برنامه تعیین کند که خود برنامه بطور اتوماتیک و بدون اینکه کاربران متوجه بشوند برنامه در وقت تعیین شده شروع به تهیه فایل پشتیبان بکند . الان مدیر شرکت بطور ناگهانی دو ماه است که برای جراحی قلب رفته و من بصورت تصادفی در شرکت دیدم که در این دو ماه هیچ فایل پشتیبانی تهیه نشده است . و مدیر شرکت این برنامه را برای رفع چنین مشکلاتی میخواهد . با برنامه بطور همزمان 10 کاربر کار میکنند .

با تشکر ...

----------


## یوسف زالی

به نام خدا ، JOB

----------


## hamid-nic

> با تشکر از همه دوستان 
> 
> من در برنامه ام منویی گذاشته ام که هروقت کاربر خواست , بتواند با استفاده از آن منو فایل پشتیان را تهیه نماید . ولی مدیر شرکت از من خواسته که برنامه ای طراحی کنم که کاربران با پشتیبان گیری کاری نداشته باشند و مدیر شرکت زمانی را برای برنامه تعیین کند که خود برنامه بطور اتوماتیک و بدون اینکه کاربران متوجه بشوند برنامه در وقت تعیین شده شروع به تهیه فایل پشتیبان بکند . الان مدیر شرکت بطور ناگهانی دو ماه است که برای جراحی قلب رفته و من بصورت تصادفی در شرکت دیدم که در این دو ماه هیچ فایل پشتیبانی تهیه نشده است . و مدیر شرکت این برنامه را برای رفع چنین مشکلاتی میخواهد . با برنامه بطور همزمان 10 کاربر کار میکنند .
> 
> با تشکر ...


دوست عزیز 
همیشه سفارش های مشتری را قرار نیست بر اساس همون چیزی که بیان می کنند شما پیاده کنید ! اون فقط نیاز هاش را میگه شما باید اون نیاز ها را بر اساس استاندارد های کاری و برنامه نویسی خودتون تطبیق بدهید نه اینکه به هر قیمتی که شده اون را پیاده کنید چون اگر استاندارد کار نکنید جلوتر که برید با مشکل روبرو میشید و همین کارفرما از چشم شما می بینه .
در مورد همین بکاپ گیری شما یک job توی سرور تعریف می کنید و بر اساس اهمیت کاری در زمان های مشخص از اطلاعات اتوماتیک بکاپ گیری می کنید بدون دخالت نیروی انسانی . معمولا این پروسه را برای زمان هایی باید تعریف کنید که بانک اطلاعاتی کمترین استفاده داره مثلا ساعت 1 شب . 
موفق باشید

----------


## ابوالفضل عباسی

من بشخصه با روش 30 دقیقه ای کار میکنم و همین طور کلاینت هام ولی،
جدیدا به این نتیجه رسیدم که وقتی خواست برنامه بسته بشه بکاپ گرفته بشه.(ولی برای برق رفتن ،خاموشی ناگهانی سرور رو ups وصل کرده ایم و سیستم hibernate فعاله.)
ولی این روش شما جالب بود،ولی ممکنه طرف نخواد پشتیبان گیری کنه تا وقتی که خواست خارج بشه.پس برای برنامه هایی که 1 کلاینت دارند روش 30 دقیقه ای هست و برای برنامه هایی که بیش از 1 کلاینت دارند روش پشتیبان گیری آنلاین و هنگام خروج(که این دسته حتما سرور دارند و ما برای جلوگیری از برق رفتن ما ups رو اجباری کرده ایم.)
بعد تازه بانک اطاعاتی بنده access هست و نمیدونم که job داره یا نه.

----------


## یوسف زالی

اگر همه با هم خارج بشن چی؟؟

----------


## ابوالفضل عباسی

این که ممکن نیست چون از چند شهر یا چند دفتر توی یک شهر وصل میشن به یک سرور و از برنامه ای که داخل اون سیستم هست استفاده میکنند.و بعد اطلاعاتی که اون کاربر به برنامه داده رو ذخیره میکنه ،نه از کل اطلاعات موجود در برنامه.
و بعد برفرض هم همه باهم خارج بشن،اطلاعات زیادی که هر کاربر وارد نکرده،وسرعت بکاپ گیری بالا هست و به دقیقه نمی کشه،و بعد زمانی که اخرین نفر از سرور خارج میشه یک بکاپ کلی از اطلاعات موجود در برنامه گرفته میشه،(اسمش رو من گذاشتم برنامه با ذخیره سازی آنی :بامزه: )این ممکنه کمی زمانبر باشه که وقتی طرف از سرور خارج میشه،این فرمان در سرور انجام میشه.چه کاربر به سرور باشه،چه نباشه،بعد یک زمانی بکاپ رو از روی سرور برمیدارن.(همه ی بکاپ ها توی سرور هستند وقتی تعداد بکاپ ها به 50 رسید،به ازای هر بکاپ جدید،یک بکاپ قدیمی از روی سرور پاک میشه.کل حجم فایل بکاپ هم 40 مگ بیشتر نیست.)
میدونم این روش خوب نیست ولی فکرنکنم access قسمت job داشته باشه

----------


## hadisalahi2

دعوا نکنید
راه ساده تری هم وجود داره که من خودم ازش استفاده میکنم
یک برنامه ساده نوشتم که فقط کارش پشتیبان گیری هستش
و روی فقط سرور هم اجرا میشه
این برنامه قابلیت تنظیم داره که هر چند دقیقه یا چند ساعت یا چند روز یک بار از بانک اطلاعاتی پشتیبان تهیه کنه

مثل باقلوا کار میکنه و تا الان هم 5 سال برنامه اتوماسیونی که نوشتم با این روش به مشکل نخورده

البته روش یوسف جان هم صد در صد روش بهینه تریه
اما من در موردش اطلاعاتی ندارم
فقط روشی که خودم گفتم رو ارایه کردم

یا حق

----------


## ابوالفضل عباسی

اون که درست،آدم که با دوست صمیمیش دعوا نمی کنه،فقط داشتیم درمورد روش بکاپ گیری گفتگو میکردیم.
من هم دوبار گفتم روش job خوبه ولی توی access نیست،پس باید این روش بکاپ گیری جواب گو بنده باشه.(تا الان هم نه هنگ کرده و نه سرور رو به تکاپو انداخته)
دوستمون سوال کرد،من هم یک راهکار گفتم،اگر بانک اطلاعاتی دوستمون sql server هست همون روش job که دوست عزیزم گفت خیلی بهتر از روش من و شماست.
کلا روش timer،یک روش نادرسته (دربعضی مواقع تنهاراهه :افسرده: )در این نوع کار چون ممکنه مدت بکاپ گیری طولانی بشه و 2 حلقه timer باهم اجرا بشه و برنامه هنگ کنه.

----------


## یوسف زالی

ببینید اگر جدلی می کنیم برای اینه که خواننده ها و خودمون از تمام ایرادات و محاسن روش های پیشنهادی مون اطلاع پیدا کنیم.
من هم روش تایمینگ و هم روش لاگین بیس و هم جاب رو پیاده کردم. روشی که هادی خان هم گفتند تست کردم، همگی جواب می ده و برای مسایل مختلفی خوبه.
یک نگرش هست در بحث تفکر های خلاق که می گه برای هر مساله ای اولین کاری که می کنید این باشه که لااقل 10 روش مختلف برای حل مساله لیست کنید اگرچه بعضی هاش خیلی خیلی مسخره به نظر بیاد. بعد بیایید و با دلیل و منطق ایرادها و خوبی های هرکدوم رو جلوش بنویسید. و دست آخر انتخاب رو انجام بدید.

منظور من از اصرار بر روش خودم، اینه که بدونم چقدر دلایل مختلف دیگه برای ایراد وارد کردن وجود داره، و چه روشهای دیگه ای می شه انجامش داد.
با احترام :-)

----------


## hadisalahi2

به نظر من روشی که من پیشنهاد دادم مزیتش سادگی پیاده سازی هست
و اینکه بار اضافی روی برنامه اصلی نمیاره و خیلی هم کم حجم هستش

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

اما در مورد روش یوسف جان نظری نمیتونم بدم چون اصلا کار نکردم و اطلاعاتی در موردش ندارم
یا حق

----------


## Mahmood_M

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


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

----------


## ابوالفضل عباسی

بنظر شما برای برنامه ای که نیاز به تایمر دارد،بجای تایمر میتوان از چه چیزی استفاده کرد که فضای اشغال شده از RAM کاهش پیداکنه و مانند تایمر عمل بکنه؟

----------


## hadisalahi2

> اما اصول کار با Thread ها نیاز به دقت زیادی داره


منم دقیقا به همین دلیل تایمر رو بر ترد ترجیح میدم  :لبخند گشاده!: 




> بنظر شما برای برنامه ای که نیاز به تایمر دارد،بجای تایمر میتوان از چه چیزی استفاده کرد که فضای اشغال شده از RAM کاهش پیداکنه و مانند تایمر عمل بکنه؟


ترد  :لبخند گشاده!:

----------


## ابوالفضل عباسی

ولی ترد که آسون نیست؟
مثل تایمر کامپوننت باشه یا مثل ترد باشه ولی با برنامه نویسی کمتر.
فکرنکنم همچین چیزی باشه

----------


## یوسف زالی

ترد سخت نیست. فقط کار باهاش دقت می خواد.
راستی چرا ترد حافظه کمتری می بره؟ دلیلی برای این گفته داری هادی ؟

----------


## ابوالفضل عباسی

یکم حرف هادی شک دار بود که ترد حافظه کمتری میگیره. :متفکر: 
آقا یوسف با ترد اشنایی زیادی ندارم،اما چرا ترد دقت میخواد؟اگر دقت نکنی چه اتفاقی مگه رخ میده؟ :متفکر: (ترد کمی پیچیده است :اشتباه: )

----------


## hadisalahi2

> راستی چرا ترد حافظه کمتری می بره؟ دلیلی برای این گفته داری هادی ؟


نه دلیلی ندارم
من در جواب ابوافضل که گفته بود روش دیگه گفتم ترد
اما متوجه اون قسمتش که نوشته بود حافظه نشدم.

حالا اگه دلیلی داره خیلی خوشحال میشم بدونم چرا حافظه کمتر میگیره

----------


## یوسف زالی

کار با ترد به این دلیل دقت می خواد چون تریس کردنش مشکل تره و گرفتن خروجی ازش نسبت به حالت عادی سخت تره، باید حواست به ددلاک ها باشه، به کریتیکال سکشن ها باشه، به منابع اشتراکی باشه، و البته به ترد اصلی باشه.
مدیریت ترد تجربه می خواد. سخت نیست، دستورات روان و مفهومی داره، اما باید حواست رو جمع کنی که اشتباهات کوچیک ممکنه بصورت نتایج فاجعه بار در بیاد. مثلا برنامه بره تو هنگ، بسته نشه، ترد های بی مورد ساخته بشه، منبع قفل بشه و ..

----------


## Mahmood_M

گرچه اصول کار با Thread بحث این تاپیک نیست اما به عنوان یک توضیح ساده ، در کار Thread ها مهمترین قسمت ارتباط بین Thread ها و ارتباط هر Thread با Thread اصلی برنامه هستش
شما از درون یک Thread نمی تونید به عناصر Visual مربوط به Thread دیگه دسترسی داشته باشید ، مثلا وقتی یک Thread فرعی میسازید ، نمی تونید درون اون عناصر Visual روی فرم رو تغییر بدید ، بلکه برای این کار باید از Synchronizing استفاده کنید، به این معنی که انجام تغییرات رو به Thread اصلی واگذار کنید
یا برای ارتباط با فرم اصلی یا ارتباط بین Thread ها از Message ها استفاده کنید
نکته ی دیگه که معمولا نیاز به دقت داره خاتمه کار Thread یا Terminate کردن اون هست، اگر در بدنه ی Thread این مورد رو چک نکنید یا به هر شکلی Thread شما نتونه به کارش خاتمه بده ، Process برنامه شما به طور کامل بسته نمیشه و در هنگام خروج از برنامه مشکل ایجاد میشه ( بسته شدن کامل Process یعنی پایان کار تمام Thread های اون Process )
در بحث بانک های اطلاعاتی ، چند نکته مهم وجود داره ، یک اینکه معمولا هر Thread باید یک Connection جدا داشته باشه ، یعنی نباید به صورت همزمان از یک Connection در دو Thread استفاده کنید و مثلا در هر کدوم Query بگیرید یا ...
نکته ی دیگه اینکه برای استفاده از اشیاء COM مثل ADO باید در ابتدای کار CoInitialize و در انتهای کار هم CoUnInitialize رو فراخوانی کنید

نکات دیگه ای هم هست که اگر درگیر کار با Thread ها بشید، به مرور بهشون میرسید

----------

