پروگرس بار در سی شارپ
سلام دوستان خسته نباشد من یه پروژه در سی شارپ طراحی کرده ام که عمل جستجوی فایل در درایو ها رو انجام میده دوستان من از یه کنترل Button با عنوان "جستجو" و یه پروگرس بار و یه تایمر استفاده کرده ام و میخام کاربر هروقت دکمه جستجو را کلیک کرد هم عمل جستجو انجام شود و هم اینکه پروگرس بار مقدار پیشرفت رو نشون بده یعنی هر دو عمل به صورت همزمان صورت گیرد دوستان ممنون میشم منو راهنمایی کنید.
5 پاسخ
دوست عزیز سلام
شما در عمل جستجو نمیتونی از progress bar استفاده کنی چون دقیقا مشخص نیست چند تا فایل قرار هست جستجو بشه؟ اگه همچنین چیزی شدنی بود مطمئنا در ویندوز ازش استفاده می شد اما میبینی که progress bar ویندوز هم حدودی هست و میبینی که اکثر اوقات صددرصد شده ولی جستجو هنوز ادامه دارد.
من هم دقیقا همین پیشنهاد رو داشتم ،
فقط اضافه کردن یکی یکی خیلی کار رو کند می کنه و بهتره که هر چند بار جستجو ، یک بار این کار رو بکنید
تو progress bar شما باید در مقاطع زمانی که خودتون می دونید ، میزان پیشرفت رو مشخص کنید ، یا درصدی یا پله ای (مثلا کل رو میدید 30 و میزان پیشرفت رو هر بار زیاد می کنید )
بهتره خودتون یه جوری همزمانی رو شبیه سازی کنید تا اینکه کلا برید تو فاز threading
مثلا ببینید اگه 10000 فایل قراره جستجو شه هر 1000 تا 10 درصد بزارید رو progress bar
سلام دوست عزیز، راهکاری که به ذهن من رسید برای کار با ProgressBar زمان جستجو اینه که شما سایز مصرف شده Drive مورد نظر رو به دست بیاری:
var driveInfo = new DriveInfo("D:");
var driveUsedSpace = driveInfo.TotalSize - driveInfo.TotalFreeSpace;
بعد بر اساس میزان سایز بررسی شده فایل ها میشه تشخیص داد که چند در صد از عملیات انجام شده، برای مثال، کد زیر عملیات جستجو رو به صورت بازگشتی در یک درایو خاص و عبارت مورد نظر جهت جستجو انجام میده، البته wildcard ها در جستجو در نظر گرفته نمیشه که برای اینکار میشه یک متد جداگانه نوشت:
public partial class MainForm : Form
{
private long processedSpaces = 0;
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, System.EventArgs e)
{
var driveInfo = new DriveInfo("D:");
var driveUsedSpace = driveInfo.TotalSize - driveInfo.TotalFreeSpace;
progressBar1.Maximum = 100;
progressBar1.Value = 0;
processedSpaces = 0;
listBox1.Items.Clear();
var thread = new Thread(() => StartSearch(".jpg", "d:\\", driveUsedSpace));
thread.Start();
}
private void StartSearch(string expression,string path, long usedSpace)
{
try
{
var files = Directory.GetFiles(path);
var folders = Directory.GetDirectories(path);
foreach (var file in files.Select(f=>new FileInfo(f)))
{
if (file.Name.Contains(expression))
{
Invoke(new Action(() => listBox1.Items.Add(file.FullName)));
}
processedSpaces += file.Length;
Invoke(new Action(() =>
{
var value = (int) ((processedSpaces*100)/usedSpace);
if (value > 100)
progressBar1.Value = 100;
else
progressBar1.Value = value;
}));
}
foreach (var folder in folders)
{
StartSearch(expression, folder, usedSpace);
}
}
catch (UnauthorizedAccessException e)
{
}
}
}
البته این نکته رو بگم که درصد خطا وجود داره، چون برنامه شما نمی تونه به تمامی فایل های موجود در درایو دسترسی داشته باشه و حجم اون فایل ها در نظر گرفته نمیشه.
یا شما می توانید تعداد تمام فایل های درایو رو قبل از جستجو پیدا کنید اما توجه کنید که این کار سرعت جستجو رو کاهش میده
وبعد progress bar.value رو در هر یک فایل جستجو با یک جمع کنید .
با این روش میتوانید همچین کاری رو انجام بدید.