PDA

مشاهده نسخه کامل : بدست آوردن مدت زمان کارکرد سیستم..؟



amirpcp30
29-03-17, 19:51
سلام دوستان ، سال نو همگی مبارک
من میخواستم یک برنامه بنویسم که هر پنج دقیقه داخل فایل txt عدد رو + 5 کنه و البته ، چون زمانی سیستم رو خاموش میکنم دقایق اخر (بین 0 تا 5 دقیقه) رو جمع نمیکنه میتونیم زمان روشن شدن سیستم + 2.5 کنیم که با درصد خیلی کمه خطا مدت کارکرد رو بدونم
این برنامه چون همیشه فعال و در startup هست پس باید کمترین حالت مصرف رو داشته باشه مثلا هر پنج دقیقه 1 درصد از سی پی یو...
به نظرتون با چه زبانی نوشته بشه بهتره؟ (آیا C++... ؟)
به چه صورت نوشته بشه کمترین حالت مصرف رو داره؟ (تایمر یا ساعت سیستم یا....)
با سپاس :give_rose:

ravegoat
04-04-17, 07:03
با سلام،

دوست عزیز سال نو شما هم مبارک :11():

انتظاری که شما از این برنامه دارید سربار بسیار کمی رو به سیستم تحمیل می کنه. در نتیجه برنامه با هر زبانی نوشته بشه، تفاوت چندانی در مصرف منابع پردازشی وجود نخواهد داشت (البته اون یک در صد به نوع پردازنده وابسته است).

زمانی که شما از ساعت سیستم استفاده کنید، عملا کلاک عمومی سیستم رو به کار گرفتید که سربار اضافه ای تلقی نمیشه. اما دقت اون در شرایط عمومی می تونه نسبت به یک تایمر اختصاصی کم تر باشه. گرچه سربار تایمر اختصاصی (مثلا Boost Chrono در C++ یا System.Timers.Timer در دات نت)در حد نا محسوسی بیش تره اما پیشنهاد میشه از این همین روش استفاده کنید چون ساعت سیستم می تونه توسط کاربر بار ها تغییر کنه.

موفق باشید
آرمین:give_rose:

amirpcp30
05-04-17, 14:03
با سلام،

دوست عزیز سال نو شما هم مبارک :11():

انتظاری که شما از این برنامه دارید سربار بسیار کمی رو به سیستم تحمیل می کنه. در نتیجه برنامه با هر زبانی نوشته بشه، تفاوت چندانی در مصرف منابع پردازشی وجود نخواهد داشت (البته اون یک در صد به نوع پردازنده وابسته است).

زمانی که شما از ساعت سیستم استفاده کنید، عملا کلاک عمومی سیستم رو به کار گرفتید که سربار اضافه ای تلقی نمیشه. اما دقت اون در شرایط عمومی می تونه نسبت به یک تایمر اختصاصی کم تر باشه. گرچه سربار تایمر اختصاصی (مثلا Boost Chrono در C++ یا System.Timers.Timer در دات نت)در حد نا محسوسی بیش تره اما پیشنهاد میشه از این همین روش استفاده کنید چون ساعت سیستم می تونه توسط کاربر بار ها تغییر کنه.

موفق باشید
آرمین:give_rose:
سلام
ممنون از شما
یک درصد رو به صورت کلی گفتم که کمترین سربار رو داشته باشه مثلا سی پی یو دوبرابر ضعیفتر باشه 2 درصد باشه زیاد تغییر نمیکنه منظورم کلی هست ، در کل در هر چند دقیقه همین یکی دو درصد باشه و در هر لحظه سرباری نداشته باشه ، تایمر اختصاصی رو نوشتم اما همچنان مشکل تایمر وجود داره
به این صورت برنامه رو تست کردم که بعد از اجرای برنامه سیستم رو sleep کردم بعد از چند دقیقه روشن کردم +4 دقیقه کرد در صورتی که همش sleep بود و فقط 1 دقیقه کارکرده بود
این برنامه ی نوشته شده هست ممنون میشم مشکل رو بفرمایید:

using System;//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Text;
using System.Windows.Forms;
using System.Timers;
using System.IO;


namespace WindowsApplication3
{
public partial class Form1 : Form
{




int s;




public Form1()
{


System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 240000;
aTimer.Enabled = true;



InitializeComponent();
StreamReader rd = new StreamReader(Application.StartupPath + "\\s.txt");



s = Convert.ToInt32(rd.ReadLine());
label1.Text = Convert.ToString(s);
rd.Close();


//StreamWriter wr = new StreamWriter(Application.StartupPath + "\\s.txt");
//wr.Write(s);
//wr.Close();



}
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
StreamWriter wr = new StreamWriter(Application.StartupPath + "\\s.txt");
wr.Write(s+=4);
wr.Close();


}


}
}
با سپاس

ravegoat
07-04-17, 19:50
با سلام مجدد،

این کد به نظر مشکلی ندارم. شاید شرایط تست تون متفاوت بوده. چون تا زمانی که 240 میلی ثانیه از زمان کارکرد سیستم نگذشته باشه، اصلا رویداد Tick تایمر صدا زده نمیشه. بنده هم تست کردم و نتایج مطابق انتظار بود!
اگر از سی شارپ استفاده می کنید، خاصیتی به نام Environment.TickCount (Only the registered members can see the link(v=vs.110).aspx)در اون وجود داره که زمان Uptime سیستم رو خیلی راحت در اختیار تون میذاره. تنها مشکلش اینه که در بازه های 50 روزه این مقدار ریست میشه. به عبارتی اگر سیستم تون از ابتدای حیات خودش به مدت 50 روز روشن مونده باشه و خاموش نشه، خاصیت مذکور صفر میشه. البته با یک سری ترفند می تونید بر این محدودیت فایق بیایید.

amirpcp30
07-04-17, 22:05
با سلام مجدد،

این کد به نظر مشکلی ندارم. شاید شرایط تست تون متفاوت بوده. چون تا زمانی که 240 میلی ثانیه از زمان کارکرد سیستم نگذشته باشه، اصلا رویداد Tick تایمر صدا زده نمیشه. بنده هم تست کردم و نتایج مطابق انتظار بود!
اگر از سی شارپ استفاده می کنید، خاصیتی به نام Environment.TickCount (Only the registered members can see the link(v=vs.110).aspx)در اون وجود داره که زمان Uptime سیستم رو خیلی راحت در اختیار تون میذاره. تنها مشکلش اینه که در بازه های 50 روزه این مقدار ریست میشه. به عبارتی اگر سیستم تون از ابتدای حیات خودش به مدت 50 روز روشن مونده باشه و خاموش نشه، خاصیت مذکور صفر میشه. البته با یک سری ترفند می تونید بر این محدودیت فایق بیایید.
سلام
بنده هم در حالت عادی و هم در VMWare چک کردم به همین صورته ... 240000 میلی ثانیه (4 دقیقه) اما مشکل اینجاست باز هم به کلاک سیستم وابسته هست... برنامه رو باز کنید بعد اسلیپ کنید 4-5دقیقه بعد روشن کنید میبینید که +4 میشه درصورتی که سیستم 4 دقیقه روشن نبوده... (بنده به این صورت تست کردم و تنها مشکل همینجاست)
برای Environment.TickCount (Only the registered members can see the link vs.110%29.aspx) هم ممنون اما برنامه ی نوشته شده دقیقتر هست حداقل میدونم به چه صورت کار میکنه اما این مورد رو نمیدونم مثلا زمان sleep رو هم حساب میکنه یا خیر ... مثلا aida64 هم میزنه اما sleep رو هم حساب میکنه
اگه راه حلی برای مشکل بالا دارید ممنون میشم راهنمایی بفرمایید
با سپاس

ravegoat
08-04-17, 06:44
سلام
بنده هم در حالت عادی و هم در VMWare چک کردم به همین صورته ... 240000 میلی ثانیه (4 دقیقه) اما مشکل اینجاست باز هم به کلاک سیستم وابسته هست... برنامه رو باز کنید بعد اسلیپ کنید 4-5دقیقه بعد روشن کنید میبینید که +4 میشه درصورتی که سیستم 4 دقیقه روشن نبوده... (بنده به این صورت تست کردم و تنها مشکل همینجاست)
برای Environment.TickCount (Only the registered members can see the link vs.110%29.aspx) هم ممنون اما برنامه ی نوشته شده دقیقتر هست حداقل میدونم به چه صورت کار میکنه اما این مورد رو نمیدونم مثلا زمان sleep رو هم حساب میکنه یا خیر ... مثلا aida64 هم میزنه اما sleep رو هم حساب میکنه
اگه راه حلی برای مشکل بالا دارید ممنون میشم راهنمایی بفرمایید
با سپاس
کمی عجیب به نظر میاد چون دقیقا بنده نتیجه ای متفاوت گرفتم. بهتره کل پروژه تون رو که ساختید اینجا قرار بدید تا شاید این عدم هماهنگی رفع بشه.

در مورد Environment.TickCount (Only the registered members can see the link vs.110%29.aspx) هم تا اونجا که خاطرم هست زمان Sleep بودن سیستم رو به عنوان Uptime حساب نمی کنه. با این حال می تونید چک بفرمایید.

amirpcp30
08-04-17, 10:38
سلام
خدمت شما:
Only the registered members can see the link (Only the registered members can see the link)
ویرایش:
Environment.TickCount رو چک کردم ، زمان Sleep رو هم حساب میکنه + این کد فقط زمان روشن بودن مداوم سیستم رو میده اما کدی که نوشتم به صورت کلی هست و اگه سیستم خاموش شه و بعد روشن کنیم ادامه زمان قبلی هست (مثلا زمان Uptime بودن در سال رو میتونیم بگیریم)
برنامه ای که نوشتم رو زمانی که مشکل sleep رفع شه با nssm به صورت سرویس در میارم که حتی در حالت Logoff کردم برنامه بسته نشه - در این حالت هم 4 دقیقه خطا داره چون اگه در حالت 3.59 دقیقه خاموش کنیم + 4 نمیشه و این مورد با + 2 کردن در زمان روشن شدن سیستم حل میشه و فقط درصد خیلی کمی خطا هست (در هر ریست شدن سیستم -+2 دقیقه هست)
با سپاس

ravegoat
08-04-17, 20:22
سلام
خدمت شما:
Only the registered members can see the link (Only the registered members can see the link)
ویرایش:
Environment.TickCount رو چک کردم ، زمان Sleep رو هم حساب میکنه + این کد فقط زمان روشن بودن مداوم سیستم رو میده اما کدی که نوشتم به صورت کلی هست و اگه سیستم خاموش شه و بعد روشن کنیم ادامه زمان قبلی هست (مثلا زمان Uptime بودن در سال رو میتونیم بگیریم)
برنامه ای که نوشتم رو زمانی که مشکل sleep رفع شه با nssm به صورت سرویس در میارم که حتی در حالت Logoff کردم برنامه بسته نشه - در این حالت هم 4 دقیقه خطا داره چون اگه در حالت 3.59 دقیقه خاموش کنیم + 4 نمیشه و این مورد با + 2 کردن در زمان روشن شدن سیستم حل میشه و فقط درصد خیلی کمی خطا هست (در هر ریست شدن سیستم -+2 دقیقه هست)
با سپاس
ممنون از این که بررسی فرمودید.

بنده برای اینکه مطمئن بشم تایمر موجود در پروژه ی شما در زمان Sleep تیک نمی خوره، میزان Interval رو یک ثانیه گذاشتم. بعد کدی نوشتم که تعداد تیک های خورده شده رو روی فرم نمایش بده. بعد از اجرا، سیستم رو Sleep کردم و با راه اندازی مجدد، تعداد تیک ها دقیقا" برابر مقدار قبل از Sleep بود. این به این معنی هستش که تایمر در هنگام Sleep تیک نخورده. کدش هم به این صورت بوده:


using System;
using System.IO;
using System.Timers;
using System.Windows.Forms;

namespace WindowsApplication3
{
public partial class Form1 : Form
{
int s;
int up = 0;

public Form1()
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 1000;
aTimer.Enabled = true;

InitializeComponent();
StreamReader rd = new StreamReader(Application.StartupPath + "\\s.txt");

s = Convert.ToInt32(rd.ReadLine());
label1.Text = Convert.ToString(s);
rd.Close();
}

public void OnTimedEvent(object source, ElapsedEventArgs e)
{
StreamWriter wr = new StreamWriter(Application.StartupPath + "\\s.txt");
wr.Write(s+=4);
wr.Close();

up++;
this.Invoke((MethodInvoker)delegate
{
this.Text = up.ToString();
});
}
}
}

amirpcp30
09-04-17, 13:34
ممنون از این که بررسی فرمودید.

بنده برای اینکه مطمئن بشم تایمر موجود در پروژه ی شما در زمان Sleep تیک نمی خوره، میزان Interval رو یک ثانیه گذاشتم. بعد کدی نوشتم که تعداد تیک های خورده شده رو روی فرم نمایش بده. بعد از اجرا، سیستم رو Sleep کردم و با راه اندازی مجدد، تعداد تیک ها دقیقا" برابر مقدار قبل از Sleep بود. این به این معنی هستش که تایمر در هنگام Sleep تیک نخورده. کدش هم به این صورت بوده:

سلام مجدد
خواهش میکنم ، من ممنونم از شما
این کد هم با کد من متفاوت نیست و چک کردم به همون صورت هست البته با یک ثانیه این تست رو نمیشه کرد ، منظور من این نیست که در حالت sleep عدد اضافه میکنه یا در لحظه ی اول روشن شدن چک میکنه و تمامی اعدادی که باید در sleep اضافه می شده در این لحظه اضافه بشه
منظور من این هست که در صورتی که به زمان interval رسیده یا رد شده باشه در لحظه ی اول روشن شدن که چک میکنه یکبار این تایمر فعال میشه
به طور مثال اگه interval یک ساعت باشه و شما برنامه رو باز کنید و بعد sleep ، یک روز بعد هم که سیستم رو روشن کنید یکبار تامیر فعال میشه و عدد اضافه میکنه
و همچنین اگر فقط نیم ساعت سیستم sleep باشه و بعد روشن کنید ، نیم ساعت بعد تایمر فعال میشه و عدد اضافه میکنه در صورتی که باید یک ساعت سیستم روشن باشه اما تایمر نیم ساعت sleep رو هم حساب میکنه
هم تایمر دیزاین سی شارپ و هم timers.timer این تست رو در حد 4-5 دقیقه تست کردم که هر دو به همین صورت هستند
با سپاس

ravegoat
09-04-17, 18:04
سلام مجدد
خواهش میکنم ، من ممنونم از شما
این کد هم با کد من متفاوت نیست و چک کردم به همون صورت هست البته با یک ثانیه این تست رو نمیشه کرد ، منظور من این نیست که در حالت sleep عدد اضافه میکنه یا در لحظه ی اول روشن شدن چک میکنه و تمامی اعدادی که باید در sleep اضافه می شده در این لحظه اضافه بشه
منظور من این هست که در صورتی که به زمان interval رسیده یا رد شده باشه در لحظه ی اول روشن شدن که چک میکنه یکبار این تایمر فعال میشه
به طور مثال اگه interval یک ساعت باشه و شما برنامه رو باز کنید و بعد sleep ، یک روز بعد هم که سیستم رو روشن کنید یکبار تامیر فعال میشه و عدد اضافه میکنه
و همچنین اگر فقط نیم ساعت سیستم sleep باشه و بعد روشن کنید ، نیم ساعت بعد تایمر فعال میشه و عدد اضافه میکنه در صورتی که باید یک ساعت سیستم روشن باشه اما تایمر نیم ساعت sleep رو هم حساب میکنه
هم تایمر دیزاین سی شارپ و هم timers.timer این تست رو در حد 4-5 دقیقه تست کردم که هر دو به همین صورت هستند
با سپاس
الان متوجه منظورتون شدم. بله فرمایش شما صحیح هستش. اگر در زمان Sleep تایمر رویداد (های) Tick رو از دست بده تنها یک بار رویداد Tick را صدا می زنه و سپس از اول شروع به شمارش می کنه. البته اگر Interval رو کم تر کنید خطای آن چنانی در رخ نخواهد داد. مضافا این که در طول شبانه روز بعید می دونم کاربر 100 بار سیستم رو Sleep کنه و شما 400 دقیقه خطا داشته باشید.

با این حال می تونید با رویداد سیستمی SystemEvents.PowerModeChanged (Only the registered members can see the link) زمان Sleep شدن و بیدار شدن سیستم رو متوجه بشید و در صورت وقوع رخداد یک Interval رو از شمارنده تون کم کنید.

شاد باشید
آرمین:11():

amirpcp30
09-04-17, 20:09
الان متوجه منظورتون شدم. بله فرمایش شما صحیح هستش. اگر در زمان Sleep تایمر رویداد (های) Tick رو از دست بده تنها یک بار رویداد Tick را صدا می زنه و سپس از اول شروع به شمارش می کنه. البته اگر Interval رو کم تر کنید خطای آن چنانی در رخ نخواهد داد. مضافا این که در طول شبانه روز بعید می دونم کاربر 100 بار سیستم رو Sleep کنه و شما 400 دقیقه خطا داشته باشید.

با این حال می تونید با رویداد سیستمی SystemEvents.PowerModeChanged (Only the registered members can see the link) زمان Sleep شدن و بیدار شدن سیستم رو متوجه بشید و در صورت وقوع رخداد یک Interval رو از شمارنده تون کم کنید.

شاد باشید
آرمین:11():
سلام
ممنون از شما
برنامه رو به همین صورت نوشتم تا از زمان sleep هم خیالم راحت باشه
در زمان اجرای برنامه uptime +2 میشود (به دلیل اینکه زمان خاموشی مشخص نیست میانگین 4 رو گرفتم)
count هم +1 میشود = تعداد ری استارت یا خاموش شدن
uptime هر چهار دقیقه +4
در حالت Sleep هم uptime -2 می شود (میانگین 4)
به دلیل اینکه در مدت زمان بالا این برنامه مد نظر هست اینترول رو 4 دقیقه گرفتم چون تلورانس 2 دقیقه ای در سال فقط چند ساعت میشه و فقط هر 4 دقیقه منابع سیستم رو در اختیار میگیره

using System;using System.Windows.Forms;
using System.Timers;
using System.IO;
using Microsoft.Win32;


namespace WindowsApplication3
{
public partial class Form1 : Form
{
int s,c;
string suspend;


public Form1()
{


SystemEvents.PowerModeChanged +=
new PowerModeChangedEventHandler(SystemEvents_PowerMod eChanged);




System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 240000;
aTimer.Enabled = true;




StreamReader rdc = new StreamReader(Application.StartupPath + "\\count.txt");
c = Convert.ToInt32(rdc.ReadLine());
rdc.Close();




StreamWriter wrc = new StreamWriter(Application.StartupPath + "\\count.txt");
wrc.Write(c += 1);
wrc.Close();




StreamReader rd = new StreamReader(Application.StartupPath + "\\up time.txt");
s = Convert.ToInt32(rd.ReadLine());
rd.Close();




StreamWriter wr = new StreamWriter(Application.StartupPath + "\\up time.txt");
wr.Write(s += 2);
wr.Close();
}


private void OnTimedEvent(object source, ElapsedEventArgs e)
{
StreamWriter wr = new StreamWriter(Application.StartupPath + "\\up time.txt");
wr.Write(s+=4);
wr.Close();
}




private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
suspend = Convert.ToString(e.Mode);
if (suspend == "Resume")
{
StreamWriter wr = new StreamWriter(Application.StartupPath + "\\up time.txt");
wr.Write(s -= 2);
wr.Close();
}
}


}
}
فایل پروژه هم خدمت شما: ، برای کمکهاتون خیلی ممنون ، اگه نظری هم داشتید ممنون میشم بفرمایید
Only the registered members can see the link
با سپاس :give_rose: