PDA

View Full Version : Progress Bar هنگام لود برنامه به صورت اتوماتیک



ffoxfire
جمعه 15 دی 1391, 19:40 عصر
سلام دوستان
من یه برنامه نوشتم که هر دفعه که اجرا میشه 3 الی 5 ثانیه زمان میبره که فرم اولیه نشان داده بشه...
میخام تو این زمان یه Progress Bar لود بشه (البته نسبت به اجرای برنامه) نه به صورت دستی
اگه کسی بتونه کمکم کنه خوشحال میشم

AmirGhasemi
جمعه 15 دی 1391, 20:05 عصر
من هم خيلي وقته دنباله چنين موردي هستم
مي دونم كه بايد از منابع سيستم و رم بخونه اما چطوري نمي دونم
همسايه ها ياري كنيد....

asghar2008
جمعه 15 دی 1391, 20:32 عصر
سلام دوستان
من یه برنامه نوشتم که هر دفعه که اجرا میشه 3 الی 5 ثانیه زمان میبره که فرم اولیه نشان داده بشه...
میخام تو این زمان یه Progress Bar لود بشه (البته نسبت به اجرای برنامه) نه به صورت دستی
اگه کسی بتونه کمکم کنه خوشحال میشم

سلام

باید از Thread استفاده کنی.

sasan_22
جمعه 15 دی 1391, 21:52 عصر
تا اونجایی که می دونم باید از Background Worker استفاده کنی
مثال مایکروسافت :


using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerSimple
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}

private void startAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
}

private void cancelAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
// Cancel the asynchronous operation.
backgroundWorker1.CancelAsync();
}
}

// This event handler is where the time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}

// This event handler updates the progress.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}

// This event handler deals with the results of the background operation.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
resultLabel.Text = "Canceled!";
}
else if (e.Error != null)
{
resultLabel.Text = "Error: " + e.Error.Message;
}
else
{
resultLabel.Text = "Done!";
}
}
}
}

samadblaj
شنبه 16 دی 1391, 12:25 عصر
سلام روز همگی بخیر واسه من این کد ها خیلی گنگه...

من یه فرم پدر دارم خیلی سنگینه میخوام یه فرم نمایشی با backgroundworker بذارم که فرم اصلی رو با میزان افزایش درصد یه process نمایش دهد وload شود...؟

zarrinnegar
شنبه 16 دی 1391, 13:00 عصر
این لینک رو هم ببین
http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C

plus
شنبه 16 دی 1391, 13:42 عصر
گذاشتن ProgressBar برای لود فرم اصلی دو حالت داره...یکی اینکه از نوع Marquee (مشخصه Style)باشه یعنی پر شونده نباشه و فقط نمایش بده که برنامه داره لود میشه.
برای این شما میتونی یک فرم بسازی که توش ProgressBar هست، توی سازنده فرم اصلی اون رو نمایش بدی، و آخر Form_Load فرم اصلی یا هر جای دیگه که کد های مربوط به لود تموم میشه اون رو ببندی.
حالت دوم اینه که ProgressBar پر شونده باشه.در این حالت برای اینکه شما بتونی پرش کنی، باید بدونی در هر زمان چقدر از برنامه لود شده.لود شدن برنامه #C یه موضوع ساده مثل پر شدن حافظه به صورت خطی نیست...اگه شما تاخیری در لود فرم اصلیتون دارین اول باید بررسی کنید ببینید این تاخیر از کجاست و در مرحله اول سعی کنید اون رو رفع کنید.به هر حال وقتی به کد هایی رسیدین که مشخص شد دلیل تاخیر در لود هست و این کد ها قابل حذف و یا تعغییر نبودن، باید اقدام به پر کردن Progress بار کنید.
به این صورت که فرض کنیم شما 3 عمل تاخیر زا از سازنده فرم اصلی تا آخر Form_Load فرم اصلی دارین.یکی InitializeComponent فرم، یکی لود داده های دیتابیس در Form_Load، و یکی مثلا چند دستور Select.. . بعد به صورت تجربی، در بیارین که هر کدوم از این عمل ها حدودا چند درصد از تاخیر رو شامل میشن.بعد، بعد از اجرای هر کدوم از این اعمال، مثلا بعد از InitializeComonents از طریق یک مشخصه که برای فرم لودینگ تعریف کردین، یک درصدی به مقدار ProgressBar اضافه کنید.
البته این یک ایده س، شما میتونید گسترشش بدین. اما انتظار یک روش اتوماتیک که برای شما درصد حساب کنه رو نداشته باشید D-:

samadblaj
شنبه 16 دی 1391, 13:43 عصر
این لینک رو هم ببین
http://www.codeproject.com/Articles/...sh-Screen-in-C

لینک سنگینی هست...!

این لینک (http://www.c-sharpcorner.com/uploadfile/mahesh/backgroundworker-in-c-sharp/)هم خیلی خیلی مناسبه....

ولی من نمیدونم کدم رو کجا قرار بدم کد فرم دوم...

ffoxfire
شنبه 16 دی 1391, 17:36 عصر
تا اونجایی که می دونم باید از Background Worker استفاده کنی
مثال مایکروسافت :


using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerSimple
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}

private void startAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
}

private void cancelAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
// Cancel the asynchronous operation.
backgroundWorker1.CancelAsync();
}
}

// This event handler is where the time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}

// This event handler updates the progress.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}

// This event handler deals with the results of the background operation.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
resultLabel.Text = "Canceled!";
}
else if (e.Error != null)
{
resultLabel.Text = "Error: " + e.Error.Message;
}
else
{
resultLabel.Text = "Done!";
}
}
}
}


داداش خودت تا حالا از این کد استفاده کردی؟
میشه بیشتر توضیح بدی
یا سورس اون برنامه را هم بگذاری؟

sasan_22
شنبه 16 دی 1391, 18:38 عصر
دوست عزیز سورسی بابت این موضوع ندارم ولی این کدا رو جایگزین کدهایی کن که در بالاست مثلا

if (e.Cancelled == true)

{

Application.Exit();

}

else if (e.Error != null)

{

resultLabel.Text = "Error: " + e.Error.Message;

}

else

{

form1.show();

}



یا بجای این کد



resultLabel.Text = (e.ProgressPercentage.ToString() + "%");



این کد رو بذار

ProgressBar1.value +=1;


شرمنده مثال یا سورسی بابت این موضوع ندارم فقط میخوام آشنا شده باشی با نحوه کدهای BackgroundWorker

SHD.NET
شنبه 16 دی 1391, 20:20 عصر
به نظر منم بهترین راه Background w هستش . اگ نتونستین باهاش کار کنین ، کدهاتون رو این جا بزارین تا توی Background w جاش بدیم :لبخند:

sasan_22
شنبه 16 دی 1391, 22:41 عصر
دوست عزیز سلام به نظرت این progressbar یا عکس زمان لود برنامه توی فرم جداگانه ای در نظر بگیریم یا به صورتهای دیگه(چون فقط این به ذهنم می رسه)

دومم اینه که چطور میتونم به background worker این مورد بگم که تا زمان لود اطلاعات از دیتابیس منتظر باشه ( یعنی Runworker در حال اجرا باشه)


ممنون