PDA

View Full Version : برنامه همواره در حال اجرا



ma_barnamenevis
سه شنبه 16 مهر 1392, 08:29 صبح
با سلام به دوستان

من می خوام برنامه ای بنویسم که به محض قرار گرفتن فایل خاصی در مسیر خاصی عملیاتی را اجرا کند ، من این برنامه رو با یک حلقه while و با تأخیر 2 ثانیه تحت console بصورت زیر نوشتم :


staticvoid Main(string[] args)

{

while (1 == 1)

{


Thread.Sleep(2000);


DirectoryInfo vPath = newDirectoryInfo("E:\\General\\Order\\");


FileInfo[] vF = vPath.GetFiles();


if (vF.Length != 0)

{


Process.Start("E:\\ConsoleGeneral.exe");


foreach (FileInfo _File in vF)

{

_File.Delete();

}

}

}



}




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

hamid_hr
سه شنبه 16 مهر 1392, 08:44 صبح
دو تا متغيير DirectoryInfo vPath و FileInfo[] vF قبل از حلقه while تعريف كنيد
بعد ببينيد بازم حجم برناكه افزايش پيدا ميكنه؟

ma_barnamenevis
سه شنبه 16 مهر 1392, 09:19 صبح
نه تغییری نکرد

hamid_hr
سه شنبه 16 مهر 1392, 10:25 صبح
ببين من الان تست كردم
حجم اوليه برنامه شد 720 KB
بعد كم كم رفت تا رسيد به 3900 KB
بعد دوباره برگشت به 720 KB
همين روندو تا زمان حياتش ادامه ميده

mehrdad1991h
سه شنبه 16 مهر 1392, 10:27 صبح
به جای حلقه از تایمر/نخ/بک گراند استفاده کن ببین فرقی میکنه ممکنه اوکی بشه !

negar.rafie
سه شنبه 16 مهر 1392, 10:33 صبح
استفاده از تایمر یا بک گراند ورکر میزان استفاده نرم افزار از رم را بالا میبره
فکر کنم برای این طور کارها راه بهتر و اصولی تری باشه

mehrdad1991h
سه شنبه 16 مهر 1392, 12:02 عصر
استفاده از تایمر یا بک گراند ورکر میزان استفاده نرم افزار از رم را بالا میبره
فکر کنم برای این طور کارها راه بهتر و اصولی تری باشه

درسته شما درست میگید
ولی من گفتم بعد از این که کار تموم میشه دوباره حافظه رمی که اشغال کرده بوده خالی میشه برا این گفتم !
حالا یه تست بکنه ! نمیدونم من دیگه دوستان دیگری هم هستن که بیشتر از من اطلاع دارند .....

pedram.11
سه شنبه 16 مهر 1392, 18:45 عصر
بنظر من یک راه بهتر مانیتور کردن تغییرات هارد هست، بعد اگه مکان خاصی رو در نظر دارید با یک شرط بررسی کنید. اینطوری محاسبه ی بی مورد انجام نمیشه و هروقت که فایلی در هارد تغییر کرد و یا حذف شد ازش با خبر میشید؛ نه هی پشت سر هم در یک حلقه یجایی رو چک کنید و پدر خدا بیامرز کامپیوتر رو با سی پی یو و رم یکی کنید

mehrdad1991h
سه شنبه 16 مهر 1392, 18:50 عصر
بنظر من یک راه بهتر مانیتور کردن تغییرات هارد هست، بعد اگه مکان خاصی رو در نظر دارید با یک شرط بررسی کنید. اینطوری محاسبه ی بی مورد انجام نمیشه و هروقت که فایلی در هارد تغییر کرد و یا حذف شد ازش با خبر میشید؛ نه هی پشت سر هم در یک حلقه یجایی رو چک کنید و پدر خدا بیامرز کامپیوتر رو با سی پی یو و رم یکی کنید

این برای من هم جالب شده است !
مثلا من درایو سی فلدر1 را میخوام کنترل کنم
چجوری میتونم کنترل کنم ؟ میشه ؟ اخه فک نکنم اینجوری بشه ها....!
نمونه کد دارید ؟
میشه بیشتر توضیح بدید
سپاس

pedram.11
سه شنبه 16 مهر 1392, 19:00 عصر
این برای من هم جالب شده است !
مثلا من درایو سی فلدر1 را میخوام کنترل کنم
چجوری میتونم کنترل کنم ؟ میشه ؟ اخه فک نکنم اینجوری بشه ها....!
نمونه کد دارید ؟
میشه بیشتر توضیح بدید
سپاس

چرا نشه، پس آنتی ویروسا چطور میفهمن که فایل جدیدی اضافه شده و یا تغغیر کرده که اونو پردازش کنن؟!
تا چند دقیقه بعد یک پروژه و توضیح قرار میدم

pedram.11
سه شنبه 16 مهر 1392, 19:24 عصر
سلام دوباره،برای مانیتور کردن تغییر یک پوشه میتونید از کنترل FileSystemWatcher در System.IO استفاده کنید.
برای اینکار مثلا برای مانیتور کردن تغییرات در درایو C یک FileSystemWatcher تعریف میکنیم و برای رویداد های تغغیرنام تغییر دیتا ایجاد فایل و یا حذف فایل یک متد معذفی میکنیم:
FileSystemWatcher fsw = new FileSystemWatcher(FolderDir);
fsw.Renamed += fsw_Renamed;
fsw.Changed += fsw_Changed;
fsw.Created += fsw_Created;
fsw.Deleted += fsw_Deleted;
fsw.IncludeSubdirectories = true;
fsw.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
fsw.EnableRaisingEvents = true;

IncludeSubdirectories: در نظر گرفتن پوشه های عضو زیرگروه
NotifyFilter: گزینه هایی که میخواید بررسی بشه
EnableRaisingEvents: فعال بودن مانیتور.

براتون یه پروژه هم آماده کردم. بهینه کردن کدهاش با خودتون
تصویر:
111654

ma_barnamenevis
چهارشنبه 17 مهر 1392, 09:16 صبح
کدتون عالیه فقط یه نکته مهم اینکه چطوری بدون استفاده از while و غیره این برنامه هر ثانیه اجرا بشه و کنترلش رو انجام بده ؟

pedram.11
چهارشنبه 17 مهر 1392, 09:20 صبح
این برنامه چک نمیکنه، به محض رویداد یک اتفاقی(حذف، اضافه و ویرایش فایل) با استفاده از هندلر های موجود در کنترل، متدهای مربوطه فراخوانی میشن. پس تا وقتی که کاری انجام نشده برنامه پردازش اضافی نمیکنه

ma_barnamenevis
چهارشنبه 17 مهر 1392, 10:33 صبح
خوب من exe اش رو کجا و چجوری بزارم که به موقع هندلرهاش رو فراخونی کنه ، ممنون میشم بیشتر راهنمایی کنید

pedram.11
چهارشنبه 17 مهر 1392, 10:44 صبح
خوب من exe اش رو کجا و چجوری بزارم
من متوجه نشدم، مگه شما نمیخواید از تغییرات در یک پوشه یا یک فایل مطلع بشید؟ این کدهایی که قرار دادم همین رو به شما خبر میده، کار دیگه ای میخواید انجام بدید؟