PDA

View Full Version : ساخت loading برای حالت انتظار



kimm66
یک شنبه 30 بهمن 1390, 08:36 صبح
سلام.خسته نباشید.من یه نرم افزار دارم که یه سری اطلاعات از وب سرویس میگیره.حالا میخام یه لودینگ بسازم که کاربر ببینه نرم افزار گیر نکرده و در حال انجام کار هست.لطفا اگه کسی میدونه 1 توضیحی بده.

nilmil_nil
یک شنبه 30 بهمن 1390, 10:14 صبح
سلام
دوست عزیز بستگی داره اطلاعات رو چطوری لود میکنی
من یه مثال برات میزنم امیدوارم کمکت کنه
ببین فرض کن می خوای 1000 تا رکورد رو یکی یکی از دیتا بیس بخونی و یکی یکی توی Listview نشون بدی
خو برا این کار شما باید هر رکورد با فیبلد هاشو یکی یکی بخونی بعد بریزی توی Listview خوب اینجا شما باید از حلقه
استفاده کنی
حالا این حلقه هر بار که یکی بهش اضاف میشه شما هم یکی به Progressbar اضاف کن اونوقت به همون اندازه که طول میشه لود بشه Progressbar هم به همون شکل جلو میره!
این ساده ترین مثال هست که زدم

kimm66
یک شنبه 30 بهمن 1390, 11:09 صبح
ممنون از مثال شما ولی من مشکلم اینجوری نیست.یه تابع را از وب سرویس صدا میزنم مثل تابع recive(x,y,xz).یه مدت زمانی طول میکشه تا این تابع بره به سرور و جوابش برگرده به برنامه من.من میخام تو این مدت زمان یه loading بزارم که کاربر فکر نکنه نرم افزار تعطیل شده یا هنگ کرده.بعد از اینکه جواب اومد ،loading بره و پیغام موفقیت داده بشه.همین.

m2_farzan
یک شنبه 30 بهمن 1390, 18:48 عصر
باید از Splash Screen استفاده کنی. مثل برنامه های آفیس وقتی بالا میان. اگر هم خیلی خیلی طول میکشه میتونی یه بخش از صفحه رو متحرک بذاری (مثل Boot Screen ویندوز XP) و یا عبارتی مثل Loading... بنویسی یه چند تا چراغ که به ترتیب خاموش - روشن میشن یا ...

NasimBamdad
یک شنبه 30 بهمن 1390, 20:52 عصر
برای BackUP و یا Restore دیتابیس چه طوری هست ؟ چه طوری میشه برای مدت زمانی که طول می کشه یک BackUp و یا Restore انجام بشه ؟

کد های استفاده شده برای BackUp و Restore من به صورت زیر هست


//////////////
string datez = todayShamsi().ToShortDateString();
string[] str = datez.Split('/');
for (int i = 0; i < str.Length; i++) ;
string day = str[0];
string month = str[1];
string year = str[2];
/////////////
TimeSpan z = DateTime.Now.TimeOfDay;
string mm = Convert.ToString(z);
string hour = mm.Substring(0, 2);
string minute = mm.Substring(3, 2);
////////////

SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "BACKUP DATABASE NoorAutomation TO DISK = @Destination";
cmd.Parameters.AddWithValue("@Destination", Application.StartupPath + "\\DB_BackUP\\BackUP-" + year + "-" + month + "-" + day + "_" + hour + "-" + minute + ".Bak");
cmd.ExecuteNonQuery();
cnn.Close();
pictureBox1.Visible = false;
MessageBox.Show("از دیتابیس بک آپ گرفته شد");

string[] dirs = Directory.GetFiles(Application.StartupPath + "\\DB_BackUP");
listBox1.Items.Clear();
listBox1.Items.AddRange(dirs);



if (listBox1.SelectedItem == null)
{
MessageBox.Show("لطفا یکی از بک آپ ها را انتخاب کنید");
}
else
{
pictureBox1.Visible = true;
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand("use master");
cmd.Connection = cnn;
cnn.Open();
cmd.ExecuteNonQuery();
cmd.CommandText = "ALTER DATABASE NoorAutomation SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";
cmd.ExecuteNonQuery();
cmd.CommandText = "Restore DATABASE NoorAutomation From DISK = @Destination";
cmd.Parameters.AddWithValue("@Destination", SqlDbType.VarChar);
cmd.Parameters["@Destination"].Value = listBox1.SelectedItem.ToString();
cmd.ExecuteNonQuery();
cmd.CommandText = "use master";
cmd.ExecuteNonQuery();
cmd.CommandText = "ALTER DATABASE NoorAutomation SET MULTI_USER;";
cmd.ExecuteNonQuery();
cnn.Close();
pictureBox1.Visible = false; ;
MessageBox.Show("دیتابیس بازیابی شد");
}

nunegandom
یک شنبه 30 بهمن 1390, 21:20 عصر
سلام، این‌سورس‌رو‌ببینید من این‌مطلب‌رو تویه همین‌سایت دیدم :)

NasimBamdad
یک شنبه 30 بهمن 1390, 21:24 عصر
فکر جالبی هست ، زیبایی نرم افزار رو هم افزایش میده . ، اما برای مثلا یک عملیات خاص در خود برنامه چی کار باید کرد ؟ نمیشه از فرم استفاده کرد .

b.saminjad
یک شنبه 30 بهمن 1390, 21:59 عصر
سلام


فکر جالبی هست ، زیبایی نرم افزار رو هم افزایش میده . ، اما برای مثلا یک عملیات خاص در خود برنامه چی کار باید کرد ؟ نمیشه از فرم استفاده کرد .


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

NasimBamdad
یک شنبه 30 بهمن 1390, 22:11 عصر
سلام




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

ای کاش یک یک مثالی میزد ، اصلا با Thread ها کار نکردم !

b.saminjad
یک شنبه 30 بهمن 1390, 22:16 عصر
این برنامه رو تاپیک زیر دانلود کن

تاپیک (http://barnamenevis.org/showthread.php?326540-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9%D9%87%D8%A7-%D9%88-%D8%AA%D8%B1%D9%81%D9%86%D8%AF%D9%87%D8%A7%DB%8C-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88/page2)

shadi khanum
یک شنبه 30 بهمن 1390, 23:56 عصر
دوست عزیز اگه صرفا میخواید یه جوری کاربر متوجه بشه که برنامه در حال اجرای کاری و هنگ نکرده میتونی از این sample استفاده کنی.. thread هم نیاز نداره..
موفق باشی.. به جای اون sleep(5000) که من گذاشتم فرضا شما داری اون کار زمان بر رو انجام میدی...
موفق باشی

kimm66
دوشنبه 01 اسفند 1390, 07:51 صبح
آقا ممنون از همگی.با همون فرم splash که نمونش گذاشتی حل شد.حالا چه جور میتونم 1 progress bar بزارم داخل این که با توجه به زمان پر بشه؟اصلا لازمه کنترل progressbar بزارم یا از یه تصویر متحرک که واسه لودینگ استفاده میشه ، استفاده کنم؟نظرتون چیه.

shadi khanum
دوشنبه 01 اسفند 1390, 11:45 صبح
یه تصویر متحرک کافیه واسه این کار چون فک نکنم شما قبل از اجرای اون دستور بدونی که چند ثانیه کارت طول میکشه، پس یه تصویر متحرک کارت رو راه میندازه فک کنم...
موفق باشی

kimm66
دوشنبه 01 اسفند 1390, 11:48 صبح
آخه مشکل اینه که تصویر متحرکه حرکت نمیکنه.:قهقهه:.ساکن میمونه.جالبش اینه که از تایمر و progress bar که استفاده میکنم هم تایمر start نمیشههههههههه.

m2_farzan
دوشنبه 01 اسفند 1390, 15:03 عصر
آخه مشکل اینه که تصویر متحرکه حرکت نمیکنه.:قهقهه:.ساکن میمونه.جالبش اینه که از تایمر و progress bar که استفاده میکنم هم تایمر start نمیشههههههههه.

برای نمایش دادن یه تصویر متحرک توی فرم، باید از پسوند GIF استفاده کرد.

kimm66
دوشنبه 01 اسفند 1390, 19:56 عصر
بچه ها بخدا من 7 ساله برنامه نویسم و مهندس کامپیوترم.اینقدر سطحی جواب ندید لطفا.میدونم که باید از gif استفاده کنم ولی gif رو نصفه نشون میده.متحرک نمیشه.فعلا با label نوشتم تا ببینم بعدا چی میشه.

m2_farzan
دوشنبه 01 اسفند 1390, 20:11 عصر
میتونی سه تا چراغ بذاری، با یه تایمر یه جوری تنظیمشون کنی که یکی یکه خاموش-روشن بشن... ( بحث هنری شد! ) حالا سعی میکنم تا چند دقیقه دیگه یه برنامه ای چیزی آپلود کنم تا مشکل حل بشه...

shadi khanum
دوشنبه 01 اسفند 1390, 21:11 عصر
چرا نصفه نشون میده؟من خودم تو پروژم از تصویر متحرک استفاده کردم و جواب هم میده.. اگه میتونی برنامت رو بذتر این قسمتش رو تا بشه کمک کرد

spring69
دوشنبه 01 اسفند 1390, 21:26 عصر
سلام.معلومه زمانی که شما در یک ترد میخواید این کارو انجام بدین برنامه هنگ میکنه و تصویر شما متوقف میشه چون جزئی از فرمی هست که در حال انجام عملیاته.
راحت ترین کار استفاده از backgroundworker و سپردن عملیات به اون هست.

b.saminjad
دوشنبه 01 اسفند 1390, 21:29 عصر
بچه ها بخدا من 7 ساله برنامه نویسم و مهندس کامپیوترم.اینقدر سطحی جواب ندید لطفا.میدونم که باید از gif استفاده کنم ولی gif رو نصفه نشون میده.متحرک نمیشه.فعلا با label نوشتم تا ببینم بعدا چی میشه.

سلام

از چه کمپوننتی برای نمایش gif استفاده میکنی

Chris_Ronaldo
دوشنبه 01 اسفند 1390, 22:34 عصر
یا باید از همون backgroundworker استفاده کنید که یکی از دوستان بهش اشاره کرده یا اینکه خودتون thread بنویسید چون برنامتون موقع انجام عملیات میره تو حالت هنگ.

kimm66
دوشنبه 01 اسفند 1390, 22:35 عصر
میتونی سه تا چراغ بذاری، با یه تایمر یه جوری تنظیمشون کنی که یکی یکه خاموش-روشن بشن... ( بحث هنری شد! ) حالا سعی میکنم تا چند دقیقه دیگه یه برنامه ای چیزی آپلود کنم تا مشکل حل بشه...

مشکل اینه که اصلا event مربوط به trick تایمر اجرا نمیشه.

kimm66
دوشنبه 01 اسفند 1390, 22:37 عصر
سلام

از چه کمپوننتی برای نمایش gif استفاده میکنی
اول از picturebox ولی جواب نداد.بعدشم از imageanimator که اصلا جواب نداد.هر کاری کردم نشد

kimm66
دوشنبه 01 اسفند 1390, 22:39 عصر
بچه ها لطفا اگه میشه کد بزارید.خودم همه اینارو میدونم ولی پیاده سازیش جواب نمیده.

spring69
دوشنبه 01 اسفند 1390, 22:55 عصر
بفرما83009

Chris_Ronaldo
دوشنبه 01 اسفند 1390, 23:00 عصر
از اینجا یک نمونه دانلود کنید
http://www.c-sharpcorner.com/uploadfile/mahesh/backgroundworker-in-c-sharp

kimm66
سه شنبه 02 اسفند 1390, 09:26 صبح
بچه ها بازم نشد.تصویر تا نصفه لود میشه و حرکت نداره.تایمر هم اجرا نمیشه.عین کدا رو هم کپی کردم نشد.جدا کار میکنن ولی رو فرم splash کار نمیکنن.اصلا event مربوط به backgroundworker هم اجرا نمیشه(dowork).اصلا هیچ event اجرا نمیشهههههههههه.

spring69
سه شنبه 02 اسفند 1390, 10:28 صبح
تابع زمان بر رو قرار بده ببینیم

kimm66
سه شنبه 02 اسفند 1390, 20:27 عصر
تابع زمان بر رو قرار بده ببینیم

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

spring69
سه شنبه 02 اسفند 1390, 21:58 عصر
قرار دادم نشد.متوقف میشه بازم.
منظورم اینجاست.کدتو بزار اینجا ببینیمش

kimm66
چهارشنبه 03 اسفند 1390, 13:54 عصر
آها.اینم کدها.این کدهای صفحه splash هست
private int _c;
/// <summary>
/// برای نوشتن تدریجیه لطفا صبر کنید
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Timer1Tick(object sender, EventArgs e)
{
const string str = @" ... ";
if (_c == str.Length)
{
_c = 0;
label1.Text = @"Please Wait";
}

label1.Text += str[_C++‎];
}

private void StartWaiting()
{
System.Threading.Thread.Sleep(100);
//MessageBox.Show("Finish");
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
StartWaiting();
}

private void Splash_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
اینم جایی هست که فراخونیش میکنم واسه ساختن صفحه انتظار.

spl = new Splash("main");
this.Enabled = false;
spl.Show();

spl.Refresh();
status = smsObject.SendSms(x[0], x[1], to, number, text_tb.Text, FlashSMS_ch.Checked, "", ref recId, ref smsStatus);
spl.Close();



الان بصورت عادی باید انیمیشن اجرا بشه که نمیشه.دقیقا کد bwtest هست.

kimm66
پنج شنبه 04 اسفند 1390, 14:23 عصر
اساتید چی شد؟من منتظرما.کمککککککککککککککک ککککککک

NasimBamdad
پنج شنبه 04 اسفند 1390, 16:16 عصر
بنظر من این قسمت ها زیاد کمکی نمی کنه . برنامه های بزرگ مثل WORD و PhotoShop و .. یک SPLASH دارند ، و این SPLASH میاد به مقدار زمانی که برنامه ( بسته به قدرت سخت افزار ) برای اجرا شدن و لود کردن کامپوننت هاش نیاز داره رو به SPLASH میده و بعد از اتمام کار ، یعنی بعد از بسته شدن SPLASH برنامه سریعا و در مدت زمان کمتر از 2 ثانیه ، لود میشه .


حالا فرض کنید با مثال های دوستان ما یک SPLASH طراحی کردیم و 10 ثانیه هم این SPLASH باقی بود و بعد MAIN FORM رو اجرا کنیم ،،، بازم کاری انجام ندادیم ، چون MAIN FORM ما حاوی کد هایی هست که زمان بر هست و دوباره اون زمان رو لازم داریم که MAIN FORM لود بشه .


ما باید بتوانید اون زمانی که برنامه برای لود کردن کامپوننت هاش نیاز داره رو بدست بیاریم و به اون SPLASH بدیم ، یعنی SPLASH فقط یک LABEL باشه و همزمان با SPLASH ، صفحه FORM اصلی لود بشه که رم و CPU خودش رو از سیستم بگیره که بعد از خروج SPLASH ، صفحه MAIN FORM ما کاملا لود بشه .

یک چیزی شبیه پردازش موازی . ، امیدوارم منظورم رو رسونده باشم

m2_farzan
جمعه 05 اسفند 1390, 13:35 عصر
نه، dev-dev-dev . مثل این که خوب به جزئیات مشکل توجه نکردی.

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

kimm66
شنبه 06 اسفند 1390, 07:36 صبح
برادران با استفاده از threading پیاده سازی و مشکل رفع شد.ممنون

NasimBamdad
شنبه 06 اسفند 1390, 13:40 عصر
برادران با استفاده از threading پیاده سازی و مشکل رفع شد.ممنون

میشه در مورد Thread بیشتر توضیح بدید و چند تا مثال و یا PDF چیزی بگذارید ؟

مثلا چه طوری میشه مقدار زمان یک پروسس رو اندازه گیری کرد