معرفی فریمورک اپلیکیشن نویسی Qt ‏(10)

میشه گفت کیوت سه روش برای ایجاد تایمر داره؛ QTimer، QBasicTimer و تایمر درونی QObject.
تایمر عمومی و استاندارد در کیوت QTimer هست که امکانات و انعطاف لازم رو برای تایمرهای حرفه ای مختلف داره.
اما گاهی نیاز به یک تایمر داریم که بسادگی تابعی رو در فواصل زمانی معین اجرا بکنه و برنامهء ما احتمالا ساده تر و کوچکتر از اونه که بخوایم یک کلاس اختصاصی با اسلات (Slot) مخصوص تایمر تعریف کنیم و تعریف اون رو در یک فایل جداگانه قرار بدیم و بعد یک QTimer رو هم به برنامه اضافه کرده و به اسلات کلاس خودمون متصل کنیم. احتمالا برنامهء ما کوچک و ساده هست یا یک برنامهء آزمایشی یا برای تست چیزی و میخوایم سریع و راحت و مختصر در تنها یک فایل تمام برنامهء خودمون رو گنجانده و کامپایل کنیم.
در اینگونه موارد میتونیم از تایمر درونی QObject استفاده کنیم. هر کلاس مشتق شده از QObject که عملا شامل تمامی کلاسهای خود کیوت هم میشه دارای امکان یک تایمر داخلی ساده هست.
این تایمر با تابع startTimer در QObject بکار میفته، و با فاصلهء زمانی تعیین شده تابع timerEvent رو مکرارا فراخوانی میکنه.

بعنوان نمونه این کد:

#include <QApplication>
#include <QLabel>
#include <QBasicTimer>

class TimerTest : public QObject
{

public:
TimerTest(QWidget *p, float t) {
this->p=p;
startTimer(int(t*1000));
}

void timerEvent(QTimerEvent *) {
p->setVisible(!p->isVisible());
}

QWidget *p;

};

int main(int argv, char **args) {
QApplication app(argv, args);

QLabel l("Blinking...");
l.setAlignment(Qt::AlignHCenter);
l.show();
TimerTest t(&l, .5);

return app.exec();
}

یک پنجرهء کوچک ایجاد میکنه که هر نیم ثانیه ظاهر و ناپدید میشه (نکته: چون این تنها پنجره و بنابراین پنجرهء اصلی برنامهء ما هم هست، دکمه برنامهء ما در Taskbar ویندوز هم هر بار با نامریی شدن پنجره حذف شده و با پدیدار شدنش دوباره ظاهر میشه).
همونطور که میبینید ما کلاس TimerTest خودمون رو از QObject مشتق کردیم تا امکانات QObject رو، در اصل تنها بخاطر تایمر درونی اون، به کلاس خودمون اضافه کنیم.

——————————

کلاس QBasicTimer هم خیلی شبیه به تایمر درونی QObject کار میکنه و تابع timerEvent شیء مورد نظر رو (که باید از QObject ارث بری داشته باشه) فراخوانی میکنه؛ اما بصورت یک کلاس جداگانه تعریف شده.
در مستندات این کلاس آمده که QBasicTimer در اصل برای کاربردهای داخلی خود کیوت طراحی شده (ظاهرا بخاطر پرفورمنس، از QTimer سبکتر و سریعتر هست) و بهتره برنامه نویسان از QTimer در برنامه های خودشون استفاده کنن. اما خب بهرحال این کلاس و روش تایمر داخلی QObject هم در دسترس برنامه نویسان هست و بدون مشکل کار میکنه و ضمنا همونطور که اشاره کردم مزایایی داره و در شرایط خاصی میتونه مناسبتر باشه.
توجه داشته باشید که ما از این روشهای دیگر استفاده نمیکنیم چون سبکتر و سریعتر هستن، چون این مقادیر در برنامه های برنامه نویسان اونقدری ناچیز هستن که بحساب نمیان و یک کد منعطف و خوانا خیلی بهتر از کم کردن منابع مصرفی برنامه به مقدار ناچیز هست؛ اما ما از اونها در ساده تر کردن و سریعتر کردن کدنویسی و ساخت برنامه های خیلی کوچک یا آزمایشی و یا شرایط خاص دیگر استفاده میکنیم، چون وقت و انرژی برنامه نویس حرفه ای از منابع بسیار ارزشمند محسوب میشن. البته اینها نظر و توجیه بنده برای استفاده از این روشهای نه چندان استاندارد هست!

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>