PDA

View Full Version : محاسبه زمان اجرای برنامه



mahsa.sh
سه شنبه 13 تیر 1391, 22:07 عصر
سلام
من چه جوری می تونم زمان اجرای برنامه رو محاسبه کنم.
یه چیزی شبیه تایمر می خوام که اول اجرای برنامه استارت بشه و پایانش استاپ بشه و توی خروجی طول زمان رو مثلا بر اساس ثانیه نشون بده.

mousa1992
سه شنبه 13 تیر 1391, 22:15 عصر
سلام
یه راهش اینه که تایمر بذاری و خاصیت interval اونو بذاری 1000 میلی ثانیه و متغیری رو تعریف کنی از نوع صحیح با لود شدن فرم تایمر استارت بشه و در رویداد tick تایمر یه واحد به متغیرت اضافه کنی (برای این خوبه که بخوای لحظه به لحظه توی فرم نشون بدی چقد از اجرای برنامه گذشته )
اگه میخوای اطلاعات توی بانک ذخیره بشه یا فایلی میتونی با استفاده از کلاس های TimeSpam و DateTime هنگام اجرای برنامه و خروج زمان رو بگیری و با تفریقشون مقدار استفاده رو بدست بیاری
موفق باشی

mahsa.sh
سه شنبه 13 تیر 1391, 22:25 عصر
سلام
یه راهش اینه که تایمر بذاری و خاصیت interval اونو بذاری 1000 میلی ثانیه و متغیری رو تعریف کنی از نوع صحیح با لود شدن فرم تایمر استارت بشه و در رویداد tick تایمر یه واحد به متغیرت اضافه کنی (برای این خوبه که بخوای لحظه به لحظه توی فرم نشون بدی چقد از اجرای برنامه گذشته )
اگه میخوای اطلاعات توی بانک ذخیره بشه یا فایلی میتونی با استفاده از کلاس های TimeSpam و DateTime هنگام اجرای برنامه و خروج زمان رو بگیری و با تفریقشون مقدار استفاده رو بدست بیاری
موفق باشی

میشه اون راه اول رو بیشتر و با کد توضیح بدید.
من الان یه تایمر گذاشتم ، مقدار interval رو هم 1000 گذاشتم. بقیشو نمیدونم چی کار باید کنم.

harani
سه شنبه 13 تیر 1391, 22:45 عصر
ابتدا مثلاً یک ;public int timercount تعریف میکنی یک کنترل تایمر هم میگذاری خاصیت Enabled را true میکنی و خاصیت Interval را برابر 1000 میکنی در رویداد tick این کنترل مینویسی ;++timercount
و در نهایت در رویداد Closing فرمت کد زیر رو وارد میکنی :


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
;timer1.Enabled = false
;(()MessageBox.Show(timer.ToString

}



امیدوارم مشکلنان حل شده باشد .

tooraj_azizi_1035
چهارشنبه 14 تیر 1391, 00:17 صبح
سلام
Timer روش هزینه بری است از کلاس Stopwatch استفاده کن چون دقیقاً برای محاسبه زمان اجرا طراحی شده است:


using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}

mousa1992
چهارشنبه 14 تیر 1391, 10:38 صبح
میشه اون راه اول رو بیشتر و با کد توضیح بدید.

یه متغیر از نوع int توی کلاس فرمت تعریف کن و در رویداد تیک تایمر یک واحد به counter اضافه میشه و توی لیبل نمایش میده

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int counter;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
counter++;
label1.Text = counter.ToString();
}
}
}

Mahmoud.Afrad
چهارشنبه 14 تیر 1391, 11:32 صبح
برای پروژه ویندوز فرم کافیه در کلاس program قبل و بعد از apllication.run چند خط اضافه کنید
stopwath.Start();
Application.Run(new Form1());
stopwath.Stop();
MessageBox.Show("Duration: " + stopwath.Elapsed.Duration());

mahsa.sh
چهارشنبه 14 تیر 1391, 11:38 صبح
یه متغیر از نوع int توی کلاس فرمت تعریف کن و در رویداد تیک تایمر یک واحد به counter اضافه میشه و توی لیبل نمایش میده

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int counter;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
counter++;
label1.Text = counter.ToString();
}
}
}

من این کاری که شما گفتید رو انجام دادم
ولی مثلا اگه مقدار اولیه counter بربر 0 باشه همون 0 را توی خروچی نشون میده.
کنترل timer1-tick در چه صورت اجرا میشه؟

mahsa.sh
چهارشنبه 14 تیر 1391, 11:41 صبح
برای پروژه ویندوز فرم کافیه در کلاس program قبل و بعد از apllication.run چند خط اضافه کنید
stopwath.Start();
Application.Run(new Form1());
stopwath.Stop();
MessageBox.Show("Duration: " + stopwath.Elapsed.Duration());
ممنون
ولی این برا زمانیه که بخوام وقتی برنامه تموم شد زمان رو ببینم
ولی من میخوام ولی یک متد من اجرا میشه زمان شروع تا پایانشو حساب کنم . تو برنامه یه btn دارم که با زدنش این متد دوباره اجرا میشه میخوام هر بار این تایمر صفر بشه و از اول زمان رو محاسبه کنه

mousa1992
چهارشنبه 14 تیر 1391, 11:42 صبح
کنترل timer1-tick در چه صورت اجرا میشه؟

Timer1_Tick رویداد تایمر هست و تایمر رو توی Form_Load فعال کنید

gwbasic
چهارشنبه 14 تیر 1391, 11:50 صبح
ممنون
ولی این برا زمانیه که بخوام وقتی برنامه تموم شد زمان رو ببینم
ولی من میخوام ولی یک متد من اجرا میشه زمان شروع تا پایانشو حساب کنم . تو برنامه یه btn دارم که با زدنش این متد دوباره اجرا میشه میخوام هر بار این تایمر صفر بشه و از اول زمان رو محاسبه کنه

کمی تفکر کنید تا به نتیجه مطلوب بررسید!
StopWatch همون کرونومتر هست که با Start شروع به شمارش می کنه و با Stop قطع می شه. بنابراین کافیه هر جا که می خواین متد رو صدا بزنین Start رو فراخوانی کنید و درست خط بعد از فراخوانی متد Stop رو فراخوانی کنید

Mahmoud.Afrad
چهارشنبه 14 تیر 1391, 11:53 صبح
والا عنوان تاپیک در مورد "محاسبه زمان اجرای برنامه" هست نه یک متد. ولی در هر صورت اگر دقت میکردید خودتون میتونستید راه حل رو پیدا کنید. کافیه stopwatch رو با متد restart ران کنید تا هر بار زمان رو از ابتدا محاسبه کنه. قبل و بعد از فراخوانی تابع :
static Stopwatch stopwatch = new Stopwatch();
private void button18_Click(object sender, EventArgs e)
{
stopwatch.Restart();
//Thread.Sleep(5000);
// Call your method here
stopwatch.Stop();
MessageBox.Show("Duration: "+ stopwatch.Elapsed.Duration());
}

mahsa.sh
چهارشنبه 14 تیر 1391, 11:54 صبح
Timer1_Tick رویداد تایمر هست و تایمر رو توی Form_Load فعال کنید
ببینید اخه من نمیخوام یه بار از این تایمر استفاده کنم که توی form load فعالش کنم. من می خوام هر با که یکی از متد هام اجرا میشه. این تایمر از اول محاسبه کنه
بنابراین من اول متدم تایمر رو فعال کردم و اخرش غیرفعال و بعد از غیر فعال کردنش ، توی همون متد مقدار اون رو چاپ کردم. اشتباهه؟

mousa1992
چهارشنبه 14 تیر 1391, 11:57 صبح
ببینید اخه من نمیخوام یه بار از این تایمر استفاده کنم که توی form load فعالش کنم. من می خوام هر با که یکی از متد هام اجرا میشه. این تایمر از اول محاسبه کنه
کافیه هر جا که خواستین از اول محاسبه بشه مقدار counter رو صفر کنید
اگه قرار نیست لحظه به لحظه زمان نمایش داده بشه از کلاسی که دوستان ارائه کردن استفاده کنید بهتره

mahsa.sh
چهارشنبه 14 تیر 1391, 11:58 صبح
والا عنوان تاپیک در مورد "محاسبه زمان اجرای برنامه" هست نه یک متد. ولی در هر صورت اگر دقت میکردید خودتون میتونستید راه حل رو پیدا کنید. کافیه stopwatch رو با متد restart ران کنید تا هر بار زمان رو از ابتدا محاسبه کنه. قبل و بعد از فراخوانی تابع :
static Stopwatch stopwatch = new Stopwatch();
private void button18_Click(object sender, EventArgs e)
{
stopwatch.Restart();
//Thread.Sleep(5000);
// Call your method here
stopwatch.Stop();
MessageBox.Show("Duration: "+ stopwatch.Elapsed.Duration());
}
میدونم سوالاتم ابتداییه ولی خب نمیدونم واقعا.
برای استفاده از stopwach باید چیزی خاصی رو توی using اضافه کنم؟ چون الان نمیشناسه اینو.

mahsa.sh
چهارشنبه 14 تیر 1391, 11:59 صبح
کافیه هر جا که خواستین از اول محاسبه بشه مقدار counter رو صفر کنید
ممنون ولی همچنان صفر رو در خروجی نمایش میده!

mousa1992
چهارشنبه 14 تیر 1391, 12:06 عصر
ممنون ولی همچنان صفر رو در خروجی نمایش میده!
تایمری رو که اضافه کردین کلیک کنید و در پنجره ی Properties قسمت Event را انتخاب کن و روی رویداد timer_Tick دابل کلیک کن و اونجا دستورات مربوط به اضافه کردن به تایمر و نمایش اون در لیبل رو بنویس و هر جایی که خواستی تایمر فعال بشه مقدار counter هم صفر کن ( مثلا با زدن کلیدی )

mahsa.sh
چهارشنبه 14 تیر 1391, 12:08 عصر
میدونم سوالاتم ابتداییه ولی خب نمیدونم واقعا.
برای استفاده از stopwach باید چیزی خاصی رو توی using اضافه کنم؟ چون الان نمیشناسه اینو.

جواب این سوالو پیدا کردم.
ولی در خروجی صفر نمایش داده میشه فقط. شاید چون زمانش کمتر از 1 ثانیه یا خود همون 1 ثانیه هست. درسته؟ باید چی کار کنم؟

Mahmoud.Afrad
چهارشنبه 14 تیر 1391, 12:09 عصر
برای استفاده از stopwach باید چیزی خاصی رو توی using اضافه کنم؟ چون الان نمیشناسه اینو.

using System.Diagnostics;این گونه مواقع که نیاز به یوزینگ هست با موس برو روی نام کلاس صبر کن تا لیست یوزینگ ها بیاد یا اینکه برو روی نام کلاس و shift+alt+f10 رو بزن لیستی باز میشه میتونی یوزینگ رو انتخاب کنی.

mahsa.sh
چهارشنبه 14 تیر 1391, 12:21 عصر
using System.Diagnostics;این گونه مواقع که نیاز به یوزینگ هست با موس برو روی نام کلاس صبر کن تا لیست یوزینگ ها بیاد یا اینکه برو روی نام کلاس و shift+alt+f10 رو بزن لیستی باز میشه میتونی یوزینگ رو انتخاب کنی.
ولی در خروجی صفر نمایش داده میشه فقط. شاید چون زمانش کمتر از 1 ثانیه یا خود همون 1 ثانیه هست. درسته؟ باید چی کار کنم؟

mousa1992
چهارشنبه 14 تیر 1391, 12:28 عصر
ولی در خروجی صفر نمایش داده میشه فقط. شاید چون زمانش کمتر از 1 ثانیه یا خود همون 1 ثانیه هست. درسته؟ باید چی کار کنم؟

Stopwatch sw = new Stopwatch();
label1.Text = sw.Elapsed.Milliseconds.ToString();

اینو امتحان کن بینم جواب میگری

mahsa.sh
چهارشنبه 14 تیر 1391, 13:08 عصر
خوب باید به جای Call your method here متد مورد نظرتو فراخوانی کنی دیگه. بی هیچی هم که ران کنی بالاخره تیک(کلاک) رو میده. غیر صفر

اگر هم میخوای تست کنی اون // رو از ابتدای Thread.Sleep(5000); بردار تست کن.


همه به جواب رسیدن جز شما.

کد که نوشتم! 200 خط کد اجرامیشه تا این تایمر استاپ بشه!
با اون هم امتحان کردم، همچنان صفر نمایش میده!

mahsa.sh
چهارشنبه 14 تیر 1391, 13:11 عصر
Stopwatch sw = new Stopwatch();
label1.Text = sw.Elapsed.Milliseconds.ToString();

اینو امتحان کن بینم جواب میگری

من اینو نوشتم و صفر نمایش داده. ببینید کجاشو اشتباه کردم




for (int i = 0; i < 1000; i++)

{



Thread.Sleep(1);

}

stopwatch.Stop();



TimeSpan ts = stopwatch.Elapsed;



// Format and display the TimeSpan value.



string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",

ts.Hours, ts.Minutes, ts.Seconds,

ts.Milliseconds / 10);

txt7.Text = elapsedTime.ToString();

mousa1992
چهارشنبه 14 تیر 1391, 19:59 عصر
private void Form1_Load(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Thread.Sleep(100);
sw.Stop();
label1.Text = sw.Elapsed.ToString();
}

از این کد میتونی نمونه بگیری
قبل از شروع فرایند مورد نظر که میخوای زمان اجراشو بگیری Stopwatch رو start میکنی و با تموم شدن فرایند stop میکنی و مقدارشو نشون میدی امتحانش کردم 99 میلی ثانیه رو نشون داد

mousa1992
چهارشنبه 14 تیر 1391, 20:10 عصر
در ضمن نیازی به تعریف رشته و StringFormat و .. نیست کافیه که مستقیما مثل کد بالا با متد ToString تبدیل به رشته کنی خودش ساعت و دقیقه و ..... و حتی میلی ثانیه رو نشون میده که اگه بخوای میتونی مثلا این مقدار تبدیل به ثانیه کنی یا به روز نشون بده ، دقیقه و ...

label1.Text = sw.Elapsed.TotalSeconds.ToString();