PDA

View Full Version : سوال: کندی در اجرای متد Form_Load بخاطر یک حلقه ناچیز؟!



Parham.D
چهارشنبه 09 شهریور 1390, 18:05 عصر
سلام بر دوستان عزیز و اساتید گرامی.

میخواهم در متد Form_Load درایوهای سیستم را تشخیص دهم و اگر Flash Memory به سیستم متصل بود نام آن را استخراج کنم. کد ساده و کوتاه هست اما فرم کند لود میشود. لطفا به کد توجه فرمایید:




foreach (DriveInfo EachDrive in DriveInfo.GetDrives())
if (EachDrive.DriveType == DriveType.Removable && EachDrive.IsReady)
{
removableVolumeLable = EachDrive.VolumeLabel;
removablePath = EachDrive.Name;
removableRoot = EachDrive.Name;
}


کندی زمانی پیش میاد که شرط داخل حلقه میخواهد بررسی شود. از Application.DoEvent هم استفاده کردم که نتیجه نداد. آیا راه حلی برای رفع این کندی در اجرا وجود دارد؟

ممنون از راهنمایی شما . . .

mmd2009
پنج شنبه 10 شهریور 1390, 09:29 صبح
با سلام

به این روش عمل کنید اصلا هم کند نیست :


foreach (string value in DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.Removable).Select(d => d.Name))
MessageBox.Show(value);


موفق باشید

FastCode
پنج شنبه 10 شهریور 1390, 11:57 صبح
با سلام

به این روش عمل کنید اصلا هم کند نیست :


foreach (string value in DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.Removable).Select(d => d.Name))
MessageBox.Show(value);


موفق باشید
خب معلومه کند نیست.چون شما شرط IsReady رو برداشتی.

مشکل کد اینه که حلقه foreach
break نداره.

Padrone
پنج شنبه 10 شهریور 1390, 13:39 عصر
مشکل اینجاست که خواندن وضعیت بعضی دستگاه ها مثل فلاپی دیسک یا درایور ها طولانی هست من هم همین مشکل رو داشتم واسه همین از چند نخ استفاده کردم

mmd2009
پنج شنبه 10 شهریور 1390, 13:54 عصر
خب معلومه کند نیست.چون شما شرط IsReady رو برداشتی.

مشکل کد اینه که حلقه foreach
break نداره.

خب شرط IsReady رو هم براش بذار. بازم که کند نیست :


foreach (string value in DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.Removable && d.IsReady).Select(d => d.Name))
MessageBox.Show(value);


حالا رو PC هم تستش میکنم ببینم مشکلی نداره ولی واسه لپ تاپ مشکلی نداشت چون فلاپی دیسک نداره.

=====

ویرایش :

واسه فلاپی رو pc یخورده کند شد . حق با شماست. ولی ربطی به IsReady هم نداشت.

mmd2009
پنج شنبه 10 شهریور 1390, 15:03 عصر
دوست عزیز اشتباه من این بود که به جای string باید به شکل زیر عمل می کردم.


foreach (DriveInfo driveInfo in DriveInfo.GetDrives().Where(d=>d.DriveType== DriveType.Removable))
{
cmbHdd.Items.Add(driveInfo.Name);
}



موفق باشی.

Parham.D
جمعه 11 شهریور 1390, 11:51 صبح
mmd2009 عزیز میشه لطفا کمی بیشتر درباره کد توضیح بدید. تا حالا با این مدل برخورد نکردم. مثلا d از کجا آمده؟ وقتی من حلقه شما را استفاده میکنم به Where ایراد میگیره. متن پیغام این هست:


Error 1 'System.Array' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'System.Array' could be found (are you missing a using directive or an assembly reference?) C:\Users\Parham\documents\visual studio 2010\Projects\MyFlash\MyFlash\frmMain.cs

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

Parham.D
جمعه 11 شهریور 1390, 11:53 صبح
خب معلومه کند نیست.چون شما شرط IsReady رو برداشتی.

مشکل کد اینه که حلقه foreach
break نداره.

دوست عزیز، break هم گذاشتم چیزی عوض نشد، 4 یا 5 ثانیه طول میکشه تا فرم load بشه!!

mmd2009
جمعه 11 شهریور 1390, 14:28 عصر
از فضای نام
System.Linq استفاده کردید ؟؟ نباید اشکالی وجود داشته باشه.D یک معرفی از چیزایی هست مثل پروپریتی یا متد یا ... که قابل دسترس هستن برای حلقه ای که گذاشتم. کدی که بهتون دادم زمان براش معنی نداره و به محض اجرا مشکلی نداره و درایو هارو میاره و تو pc و نوت بوک هم امتحانش کردم برات که مطئنم بشم درسته.

موفق باشید

Parham.D
شنبه 12 شهریور 1390, 09:16 صبح
موفق شدم از کد شما استفاده کنم، اما متاسفانه نتیجه نداد! هنوز فرم 5 ثانیه طول میکشد تا لود شود!! شاید ایراد از ویندوز من هست. راهنمایی دیگری هست؟!!

FastCode
شنبه 19 شهریور 1390, 01:35 صبح
System.Threading.Tasks.Parallel.ForEach

اگر با msdn نتونستی کاری بکنی, یه پست دیگه بده.(ساعت پست رو نگاه کن.چشام داره میسوزه.)

Parham.D
چهارشنبه 23 شهریور 1390, 18:26 عصر
System.Threading.Tasks.Parallel.ForEach

اگر با msdn نتونستی کاری بکنی, یه پست دیگه بده.(ساعت پست رو نگاه کن.چشام داره میسوزه.)

FastCode عزیز امیدوارم سوزش چشم شما کمتر شده باشه این روزها! متشکرم از توجه شما. از MSDN نتونستم کمک بگیرم، چرا که فقط یکی دو خط توضیح ساده داده بود و بدون هیچ مثالی ( در MSDN 2010). از خود سایت برنامه نویس هم نتونستم مطلب خوبی پیدا کنم که قابل فهم باشه، بیشتر چند سوال و جواب ساده بود. حالا اولا اگر ممکن هست برای شما؛ توضیح دهید که این Parallel.ForEach چطور کار میکند؟ دوما این مشکل کندی برنامه من در یک کامپیوتر هست و در دیگری نیست!! من در دو سیستم قوی با امکانات خوب تست کردم در یکی 1 ثانیه طول کشید و در دیگری 5 ثانیه (سیستم خودم). و در یک لپ تاپ قدیمی 1 ثانیه و در یک سیستم قدیمی 5 ثانیه!!! تمامی سیستمها ویندوز 7 داشتن به همراه آنتی ویروس. خلاصه اینکه رفتار متغیری داشته که من نمیدانم از کجا ناشی میشه. آیا راه حلی به نظر شما میرسه دوست عزیز؟!

FastCode
پنج شنبه 24 شهریور 1390, 22:00 عصر
System.Collections.Concurrent.BlockingCollection<System.IO.DriveInfo> Drives = new System.Collections.Concurrent.BlockingCollection<System.IO.DriveInfo>();
System.Threading.Tasks.Parallel.ForEach(System.IO. DriveInfo.GetDrives(), (d) =>
{
if (((d.DriveType & System.IO.DriveType.Removable) == System.IO.DriveType.Removable) && d.IsReady) Drives.Add(d);
});

تست نکردم.

پ.ن.
با این روش زمان شما از این چیزی که هست بیشتر نمیشه.(یعنی به ۱۰ یا ۱۵ یا ۲۰ نمیرسه.و حداکثر همون ۵ ثانیه میشه.)