PDA

View Full Version : سوال: چگونگی نمایش میزان پیشرفت و زمان باقی مانده برای انجام پروسه



papeli_83
سه شنبه 29 مرداد 1392, 17:34 عصر
با سلام خدمت همه دوستان

من یه برنامه محاسباتی سنگین دارم که خروجی این برنامه جوابهایی دارد که هرکدام از جوابها دارای 10 تا پارامتر هستندحالا میخوام با استفاده از progress bar و background worker درصد پیشرفت کار و همچنین زمان انجام کار رو داشته باشم ( یعنی وقتی کاربر دکمه run رو کلیک کرد کل زمان نشون داده بشه و با پیشرفت کار از زمان کم بشه, مثل وقتی که فایلی رو کپی میکنیم زمان رو نشون می ده) اما متاسفانه نمیدونم برای انجام درصد پیشرفت کار BackgroundWorker1.ReportProgressرو چطور مقدار دهی کنم و همچنین روش محاسبه زمان رو بشکلی که بالا توضیح دادم رو نمی دونم :گریه:

mousa1992
سه شنبه 29 مرداد 1392, 18:31 عصر
پروژه پیوست شده رو ببین

Amin69
سه شنبه 29 مرداد 1392, 19:12 عصر
منم خیلی دنبال این مورد هستم؛ تمام آموزش ها و نمونه پروژه هایی که دیدم، یه عدد میذارن و اینجور نیست که زمان انجام برنامه رو تخمین بزنه. اگه کسی همچین کدی داشته باشه، مضایقه نکنه...

FastCode
سه شنبه 29 مرداد 1392, 19:40 عصر
http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation

papeli_83
سه شنبه 29 مرداد 1392, 20:22 عصر
پروژه پیوست شده رو ببین

با تشکر از شما دوست عزیز منطورم این نبود که خودتون دستی یه مقدار بهش بدین ! بلکه بطور واقعی و با پیشرفت کار محاسباتی مقادیر واقعی نشون داده بشه !!!

mousa1992
سه شنبه 29 مرداد 1392, 20:30 عصر
از پست اولتون برداشت میشه که نمیدونید چجوری با backgroundworker کار کنید منم ی نمونه بهتون دادم
بستگی به کاری که میخواید انجام بدید داره اگه مثلا میخواین ی چیزی رو از دیتابیس فراخوانی کنید که به راحتی میتونید انجام بدید ( تعداد رکوردهارو میگیرید و max مربوط به progressBar رو تعداد میذارید و یکی یکی رکورد هارو بازگردانی میکنید و یا اگه بخواین عمل کپی انجام بدید میتونید از متدهایی که خودتون مینویسید برا کپی کردن استفاده کنید تا بتونید حین انجام کار گزارش از پیشرفت هم بگیرید و خب عملیاتی مثل بکاپ گیری هم باز به همین صورت میشه هرچند برا بعضی کارها کامپوننت هایی رو طراحی کردند که میتونی پیشرفت کارو ببینی
دقیق بگو چیکار میخوای انجام بدی

papeli_83
سه شنبه 29 مرداد 1392, 20:44 عصر
http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation

با تشکر از شما

دوست عزیز من متوجه نشدم که چی میگن!!!! میشه خودتون یه توضیحی بدین

FastCode
سه شنبه 29 مرداد 1392, 20:47 عصر
باید یک مقدار حساب دیفرانسیل بلد باشید.فکر نمیکنم طور دیگه بشه توضیح داد.

papeli_83
سه شنبه 29 مرداد 1392, 21:02 عصر
از پست اولتون برداشت میشه که نمیدونید چجوری با backgroundworker کار کنید منم ی نمونه بهتون دادم
بستگی به کاری که میخواید انجام بدید داره اگه مثلا میخواین ی چیزی رو از دیتابیس فراخوانی کنید که به راحتی میتونید انجام بدید ( تعداد رکوردهارو میگیرید و max مربوط به progressBar رو تعداد میذارید و یکی یکی رکورد هارو بازگردانی میکنید و یا اگه بخواین عمل کپی انجام بدید میتونید از متدهایی که خودتون مینویسید برا کپی کردن استفاده کنید تا بتونید حین انجام کار گزارش از پیشرفت هم بگیرید و خب عملیاتی مثل بکاپ گیری هم باز به همین صورت میشه هرچند برا بعضی کارها کامپوننت هایی رو طراحی کردند که میتونی پیشرفت کارو ببینی
دقیق بگو چیکار میخوای انجام بدی

با سلام مجدد
من برنامم یه برنامه محاسباتیه , چند تا پارامتر رو به عنوان ورودی می گیره و محاسبات لازم رو انجام می ده و یه تعداد جواب می ده , حالا من می خوام که با یه proggress bar میزان پیشرفت کار رو به کاربر نمایش بدم , تا جایی که می دونم برای این کار بهترین روش استفاده از backgroundworker هستش , اما برای نشون دادن درست پیشرفت کار نمی دونم چطور باید BackgroundWorker.ReportProgress رو مقدار دهی کنم , مثالی رو که شما نوشتین در صورتی که ما یک حلقه داشته باشیم و تمام کارهامون تو اون حلقه انجام بشه کاربردیه ولی برنامم جوریه که چندتا حلقه داره که تو در تو نیستن , در واقع بخش اول سوال من اینجاست که چجوری بایدBackgroundWorker.ReportProgress رو مقدار دهی کنم؟
در مورد بخش دوم هم اگر راهنماییم کنید ممنون میشم

papeli_83
سه شنبه 29 مرداد 1392, 21:05 عصر
باید یک مقدار حساب دیفرانسیل بلد باشید.فکر نمیکنم طور دیگه بشه توضیح داد.

والا حساب دیفرانسیلم بد نیست ولی زبانم خوب نیست ( با مترجم گوگل ترجمه کردم ولی چیزی دستگیرم نشد )

FastCode
سه شنبه 29 مرداد 1392, 21:17 عصر
متغیر و پارامتر خیلی داره و با توجه به شراط باید فرمول رو بنویسید.
مثلا اینکه میخواهید همه ی نمونه ها در نظر گرفته باشه یا نه؟
همه یک اندازه در تخمین تاثیر بزارن یا نه؟
همه نمونه ها مقدار ثابتی دارند یا نه؟
آیا ممکنه بینشون pause شده باشه یا نه؟
اگر pause وجود دارد:
ممکن است حجم cache در محاسبه زمان تاثیر داشته باشد؟
اگر سیستم عامل چیزی را buffer یا cache میکند باید در نظر گرفته شود یا خیر؟
آیا همزمان اجرا شدن یا نه؟
آیا برنامتون به عملکرد سخت افزار دیگه ای وابسته هست و میخواهید در صورتی که توسط برنامه ی دیگه ای استفاده میشده در نظر گرفته بشه؟
اگر چند نوع عملیات انجام میشود(مثل دانلود منجر ها;دانلود و ذخیره کردن اطلاعات) کدام یک باید در محاسبه نقش داشته باشد؟
اگر تعداد عملیات بسیار زیاد است و محاسبه وقت گیر عملیات باید به چه شکل دسته بندی شوند؟(کپی کردن تعداد زیادی فایل)
اگر بعضی از عملیات طولانی هستند آیا نیاز به خرد شدن دارند یا نه؟(کپی کردن چند فایل حجیم)
و خیلی سوالات دیگه که روی فرمولتون تاثیر میزارن و تا خیلی هاشون رو آزمایش نکنید نمیتونید تصمیم بگیرید.
برای همین میگم که باید حساب دیفرانسیل بلد باشید.پایه کامپیوتر فوتوشاپ نیست.ریاضیه.

papeli_83
سه شنبه 29 مرداد 1392, 21:44 عصر
متغیر و پارامتر خیلی داره و با توجه به شراط باید فرمول رو بنویسید.
مثلا اینکه میخواهید همه ی نمونه ها در نظر گرفته باشه یا نه؟
همه یک اندازه در تخمین تاثیر بزارن یا نه؟
همه نمونه ها مقدار ثابتی دارند یا نه؟
آیا ممکنه بینشون pause شده باشه یا نه؟
اگر pause وجود دارد:
ممکن است حجم cache در محاسبه زمان تاثیر داشته باشد؟
اگر سیستم عامل چیزی را buffer یا cache میکند باید در نظر گرفته شود یا خیر؟
آیا همزمان اجرا شدن یا نه؟
آیا برنامتون به عملکرد سخت افزار دیگه ای وابسته هست و میخواهید در صورتی که توسط برنامه ی دیگه ای استفاده میشده در نظر گرفته بشه؟
اگر چند نوع عملیات انجام میشود(مثل دانلود منجر ها;دانلود و ذخیره کردن اطلاعات) کدام یک باید در محاسبه نقش داشته باشد؟
اگر تعداد عملیات بسیار زیاد است و محاسبه وقت گیر عملیات باید به چه شکل دسته بندی شوند؟(کپی کردن تعداد زیادی فایل)
اگر بعضی از عملیات طولانی هستند آیا نیاز به خرد شدن دارند یا نه؟(کپی کردن چند فایل حجیم)
و خیلی سوالات دیگه که روی فرمولتون تاثیر میزارن و تا خیلی هاشون رو آزمایش نکنید نمیتونید تصمیم بگیرید.
برای همین میگم که باید حساب دیفرانسیل بلد باشید.پایه کامپیوتر فوتوشاپ نیست.ریاضیه.

با تشکر از شما

من رشتم برقه! ودارم یه برنامه محاسباتی می نویسم که این برنامه توسط برنامه دیگه ای استفاده نمیشه ; فقط قابلیت کنسل کردن رو داره(برا موقعی که کاربر مقادیر ورودی رو درست انتخاب نکرده باشه یا وقتی که برنامه رفت تو کما !!) و اگه کاربر بخواد دوباره شروع کنه محاسبات از اول شروع میشه ; فقط هم کار محاسبه رو انجام می ده ; چند تا حلقه داره ومحاسبات تو اون حلقه ها انجام میشه در ضمن نمیخوام تا ده هزارم ثانیه رو درست نشون بده ( شما خیلی سختش کردین )
اگه براتون امکان داره با یه مثال راهنماییم کنین ممنون میشم( حمل بر تنبلی نشه , بدجوری گیر کردم)

FastCode
سه شنبه 29 مرداد 1392, 22:37 عصر
با تشکر از شما

من رشتم برقه! ودارم یه برنامه محاسباتی می نویسم که این برنامه توسط برنامه دیگه ای استفاده نمیشه ; فقط قابلیت کنسل کردن رو داره(برا موقعی که کاربر مقادیر ورودی رو درست انتخاب نکرده باشه یا وقتی که برنامه رفت تو کما !!) و اگه کاربر بخواد دوباره شروع کنه محاسبات از اول شروع میشه ; فقط هم کار محاسبه رو انجام می ده ; چند تا حلقه داره ومحاسبات تو اون حلقه ها انجام میشه در ضمن نمیخوام تا ده هزارم ثانیه رو درست نشون بده ( شما خیلی سختش کردین )
اگه براتون امکان داره با یه مثال راهنماییم کنین ممنون میشم( حمل بر تنبلی نشه , بدجوری گیر کردم)
اگر کدتون رو بزارید و توضیح بدید که هر حلقه چقدر اجرا میشه میتونم کمکتون کنم.
کدی که همینجوری روی هوا نوشته بشه معمولا سرعت برنامتون رو خیلی کم میکنه.
در ضمن این سوالات برای دقت ده هزارم ثانیه نبود.
برای دقت اشتباه نکردن بین ساعت و ثانیه بود.
برای اون دقت باید خیلی بیشتر از اینها سوال جواب داد و پارامتر به فرمول اضافه کرد.

papeli_83
سه شنبه 29 مرداد 1392, 23:56 عصر
اگر کدتون رو بزارید و توضیح بدید که هر حلقه چقدر اجرا میشه میتونم کمکتون کنم.
کدی که همینجوری روی هوا نوشته بشه معمولا سرعت برنامتون رو خیلی کم میکنه.
در ضمن این سوالات برای دقت ده هزارم ثانیه نبود.
برای دقت اشتباه نکردن بین ساعت و ثانیه بود.
برای اون دقت باید خیلی بیشتر از اینها سوال جواب داد و پارامتر به فرمول اضافه کرد.

من برناممو نمی تونم اینجا قرار بدم ( چون تو محل کارمه!!) ولی کدای یه برنامه کوچیک رو اینجا میزارم ; فقط متغییرهای برنامم و حلقه هاش بیشترن و بازه حلقه ها توسط کاربر مشخص میشه !!

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
Public Class Form1
{

private static int sum;
private static int t;

private static int s;
private void BackgroundWorker1_DoWork(System.Object sender, System.ComponentModel.DoWorkEventArgs e)
{
for (int i = 1; i <= 10000; i++) {
for (int j = 1; j <= 10000; j++) {
sum = (sum + i) % j;
}
if (BackgroundWorker1.CancellationPending) {
return;
}
// BackgroundWorker1.ReportProgress(i / 1000)
}
for (int k = 1; k <= 10000; k++) {
t = k + 2 * k;
}
s = t + sum;
}

private void Button1_Click(System.Object sender, System.EventArgs e)
{
Button1.Enabled = false;
Button2.Enabled = true;
ProgressBar1.Value = 0;
ProgressBar1.Visible = true;
BackgroundWorker1.RunWorkerAsync();
}

private void BackgroundWorker1_RunWorkerCompleted(System.Object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
Button1.Enabled = true;
Button2.Enabled = false;
ProgressBar1.Visible = false;
}

private void BackgroundWorker1_ProgressChanged(System.Object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
ProgressBar1.Value = e.ProgressPercentage;
ProgressBar1.CreateGraphics().DrawString(e.Progres sPercentage.ToString() + "%", new Font("Arial", 8.25, FontStyle.Regular), Brushes.Black, new PointF(ProgressBar1.Width / 2 - 10, ProgressBar1.Height / 2 - 7));
}

private void Button2_Click(System.Object sender, System.EventArgs e)
{
BackgroundWorker1.CancelAsync();
}
}

FastCode
چهارشنبه 30 مرداد 1392, 00:05 صبح
برنامه با برنامه فرق داره.
توی این مثال که اشتباه محاسباتی هم داره خیلی ساده میشه با مشتق هم مساله رو حل کرد و هیچ نیازی به دیفرانسیل نداره.
برنامه اصلی رو بزارید.

اینها همه مثال و نمونه کد برای حالتی که هیچ کدوم از اون اگر ها نیستند:
http://stackoverflow.com/questions/473355/calculate-time-remaining

papeli_83
چهارشنبه 30 مرداد 1392, 00:17 صبح
ممنون از راهنماییتون ولی برنامه اصلی رو متاسفانه نمی تونم بزارم
(امشب که وقت نمیشه ولی فردا سعی میکنم برنامه شبیه برناممو قرار بدم )

esafb52
چهارشنبه 30 مرداد 1392, 00:38 صبح
از پست اولتون برداشت میشه که نمیدونید چجوری با backgroundworker کار کنید منم ی نمونه بهتون دادم
بستگی به کاری که میخواید انجام بدید داره اگه مثلا میخواین ی چیزی رو از دیتابیس فراخوانی کنید که به راحتی میتونید انجام بدید ( تعداد رکوردهارو میگیرید و max مربوط به progressBar رو تعداد میذارید و یکی یکی رکورد هارو بازگردانی میکنید و یا اگه بخواین عمل کپی انجام بدید میتونید از متدهایی که خودتون مینویسید برا کپی کردن استفاده کنید تا بتونید حین انجام کار گزارش از پیشرفت هم بگیرید و خب عملیاتی مثل بکاپ گیری هم باز به همین صورت میشه هرچند برا بعضی کارها کامپوننت هایی رو طراحی کردند که میتونی پیشرفت کارو ببینی
دقیق بگو چیکار میخوای انجام بدی
با سلام بعضیی مواقع من با مشکل مواجه میشم تو این مسئله شما فکر کنید 150 (البته به فرض تعداد نا معلوم و بالاتر از صد) سطر تو گرید هست که میخوای تو دیتابیس درج کنی یا هر کاری که تعداد بیشتر از 100 هست اونقت پروگرس بار خطا ماکزیمم ولیو میده این موارد رو چطور حل کنیم یا اصلا بعضی مواقع با چیزی هایی طرف هستیم که خاصیتی مثل طول و... ندارن که بشه با اون کار کرد در این موارد چکار کنیم

mousa1992
چهارشنبه 30 مرداد 1392, 01:07 صبح
با سلام بعضیی مواقع من با مشکل مواجه میشم تو این مسئله شما فکر کنید 150 (البته به فرض تعداد نا معلوم و بالاتر از صد) سطر تو گرید هست که میخوای تو دیتابیس درج کنی یا هر کاری که تعداد بیشتر از 100 هست اونقت پروگرس بار خطا ماکزیمم ولیو میده این موارد رو چطور حل کنیم یا اصلا بعضی مواقع با چیزی هایی طرف هستیم که خاصیتی مثل طول و... ندارن که بشه با اون کار کرد در این موارد چکار کنیم
سلام
progressBar محدودیتی برا maximum مقدار نداره و نمیدونم چرا چنین خطایی میگیره
برا اون چیزایی که میگی هر کدوم راهی داره خب مثلا برا کپی گرفتن خودت باید انجامش بدی و الگوریتم ها رو بنویسی ( البته من این کارو نکردم ) برا چه کاری میخواین روند پیشرفتو نمایش بدین ؟