06-09-2005, 07:48
|
|
|
|
חבר מתאריך: 16.07.02
הודעות: 6,814
|
|
לגבי ההשהייה שביקשת:
המון מתכנתים מתחילים עושים בתוכנה שלהם לולאה אינסופית(עד שמגיע תנאי סגירת התוכנית)
ובכדי ליצור אפקט של השהייה הם פשוט עושים
זה לא נחוץ ואף מיותר. הדרך הנוחה לעבוד עם תהליכים שמתעדכנים כל X שניות היא פשוט
ליצור אובייקט שייצג את התהליך שלנו ויהיה בו ממשק נוח שדרכו נוכל לשלוט ולפקח על התהליך.
הרעיון המרכזי הוא ליצור מחלקה שתייצג תהליך. למחלקה כמה פונקציות ומשתנים עיקריים.
הכנתי לך מחלקה בסיסית שתראה לך את העקרונות, היא לא בנויה בצורה הכי טובה, אבל היא בנויה בצורה ברורה.
משתנים:
m_iUpdate => משתנה המייצג את הפרשי הזמן בין עדכון לעדכון.
m_iData => משתנה שמייצג את הנתון של האובייקט. כאן בחרתי באופן אקראי בזה. אתה יכול לשנות
את זה למה שאתה רוצה.
פונקציות:
CProcess => פונקצייה מסוג בנאי. נותנת ערך התחלתי למשתנה m_iData ובוחרת את זמן העדכון.
pmf_updateObj => פונקצייה פרטית שמעדכנת את האובייקט.
getData => פונקצייה המחזירה את ערכו של משתנה m_iData. כמובן שגם כאן אתה יכול לשנות למה שאתה רוצה.
check => זאת הפונקצייה שכעקרון מפקחת ובודקת מתי על המשתנה להתעדכן. היא פשוט מכריזה
בהתחלה על המשתנה lastUpdateTime(שים לב! משתנה סטטי). ובודקת כל פעם אם צריך עדכון
לפי התנאי הבא - אם זמן נוכחי גדול או שווה ( m_iUpdate + lastUpdateTime )
במידה וכן הפונקצייה תקרא לפונקצייה pmf_updateObj ותחזיר 'אמת'. במידה ולא, הפונקצייה תחזיר 'שקר'.
אחרי שעשינו את כל זה כל מה שנותר לנו לעשות הוא לכתוב תוכנית עם לולאה שכל איטרציה
קוראת לפונקצייה check של התהליך.
הנה דוגמה לקוד לתוכנית דוגמה:
קוד:
#include <iostream.h>
#include <time.h>
//
// Class: CProcess
//
class CProcess
{
private:
int m_iUpdate, m_iData;
bool pmf_updateObj();
public:
CProcess(int t_sec = 5) { m_iUpdate = t_sec; m_iData = 0;}
bool check();
int getData();
~CProcess() {}
};
bool CProcess::pmf_updateObj()
{
++m_iData;
return true;
}
bool CProcess::check()
{
static long lastUpdateTime = time(NULL);
if( time(NULL) >= (lastUpdateTime+m_iUpdate) )
{
lastUpdateTime = time(NULL);
pmf_updateObj();
return true;
}
return false;
}
int CProcess::getData()
{
return m_iData;
}
//
// main
//
int main(void)
{
CProcess objP1(1);
while(objP1.getData() < 5)
{
if(objP1.check())
{
cout << "object's status: " << objP1.getData() << endl;
}
else {
cout << ".";
}
}
return 0;
}
פלט התוכנית: התוכנית תדפיס אחרי כל עדכון של האובייקט את מצב המשתנה m_iData.
הוספתי גם הדפסה של 'נקודה' כאשר יש איטרציה ללא עדכון וזאת רק כדי להמחיש לך שבאמת יש איטרציה ללא עדכון.
טוב, מכאן אני מקווה שתסתדר לבד.
הערה I: כל זה תקף רק כאשר אתה מתכנת תחת dos. בwindows אין צורך לעשות את זה ידנית.
הערה II: אתה יכול לשפר את המחלקה עוד ועוד, דבר ראשון על ידי כך שתשנה את העדכון של השניות לעשכון של מילי-שניות.
הערה III: כמובן שאתה יכול להשתמש בכמה תהליכים במקביל.
מקווה שלמדת משהו מזה.
_____________________________________
|