PDA

View Full Version : یک سوال داشتم در مورد ProgressBar



smt_414
پنج شنبه 25 مرداد 1386, 18:04 عصر
سلام به همه دوستان
یک سوال داشتم در مورد ProgressBar
میخواستم ببینم اگر بخواهیم در زمانی, مثلا زمانی که برنامه در حال چک کردن موردی است که کمی وقت می گیرد, تو این زمان ProgressBar شروع به عمل کرده و همزمان با پایان عمل جستجو, ProgressBar هم به انتها برسه چه باید کرد.
اگر بتونید منبعی(pdf , ebook) به من معرفی کنید ممنوم می شوم. :بوس:

PC2st
پنج شنبه 25 مرداد 1386, 19:42 عصر
بهترین راه حل برای اینکار، استفاده از Threading است.
یک برنامه Windows Application جدید بسازید و کدهای زیر رو درون فایل Form1.cs کپی کنید:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
private System.Windows.Forms.ProgressBar progressBar1;
public Form1()
{
InitializeComponent();
this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.progressBar1.Location = new System.Drawing.Point(12, 12);
this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(268, 23);
this.progressBar1.TabIndex = 0;
this.Controls.Add(this.progressBar1);
}
private void Form1_Load(object sender, EventArgs e)
{
Thread waitThread = new Thread(new ThreadStart(DoWork));
waitThread.Start();
}
private void DoWork()
{
for (int i = 0; i < 100; i++)
{
this.Invoke(new ThreadStart(SafeCall));
Thread.Sleep(25);
}
MessageBox.Show("OK");
}
private void SafeCall()
{
this.progressBar1.Value++;
}
}
}

امیدوارم بتونه راهنمائیتون کنه.

alirzn
جمعه 26 مرداد 1386, 17:24 عصر
دوست عزیز ممنونم از راهنماییتون
اما این کد طی یک مدت زمان خاصی پر می شود
اما قصد من این است که طی زمانی که برنامه تاخیر دارد کار کند
مثلا یک buttom داریم که با زدن آن برنامه شروع به backup گرفتن از database می کند و مدتی طول می کشد. من می خوام تو این مدت progressbar پر شود
اگر کمکم کنید ممنون می شم.

Asad.Safari
جمعه 26 مرداد 1386, 18:02 عصر
اما این کد طی یک مدت زمان خاصی پر می شود


فکر نکنم همچین امکانی تو visual studio باشه !
شما باید حتما خودت یه زمانی رو تخمین بزنی !


موفق باشید

alirzn
جمعه 26 مرداد 1386, 22:32 عصر
کد sql server که تاخیر داره رو باید کجای کد بالا که thread هست باید بنویسم؟

PC2st
جمعه 26 مرداد 1386, 23:17 عصر
بجای کد (Thread.Sleep(25، عملیاتی رو انجام بدید که وقت گیر هستند و البته بصورت تکراری صورت میگیرند، مثلا کپی کردن 400 تا فایل که عملیات کپی در یک حلقه تکرار قرار میگیره و در این حلقه در هر تکرار، یک فایل کپی و ProgressBar هم آپدیت میشه.

اما برای عملیاتی مثل همون آپدیت گیری از دیتابیس، نمیتونه مفید واقع بشه.

amin_hz
شنبه 27 مرداد 1386, 08:03 صبح
می تونی از ترکیبی از یه تایمر و پایان اون کار استفاده کنی.

PC2st
شنبه 27 مرداد 1386, 13:03 عصر
می تونی از ترکیبی از یه تایمر و پایان اون کار استفاده کنی.
در صورتی که زمان پایان عملیات رو تخمین زده باشی.

amin_hz
شنبه 27 مرداد 1386, 13:09 عصر
البته اگه تعداد کارها مشخص باشه مثلا تعداد فایلها برای کپی شدن یا یه چیزی مثل این میشه با یه رابطه ریاضی ساده مقدار حرکت به جلوی progress bar مشخص کرد.

Hadizadeh
شنبه 27 مرداد 1386, 13:30 عصر
من دلفی کارم. والله تو دلفی یه دستور داریم Application.ProcessMessage که این کارو می کنه. البته جزو API ویندوز هست شاید به دردتون بخوره