کلاس QAbstractNetworkCache در Qt
- codenevisam
- کلاس ها در کیوت, کلاس های شبکه در کیوت

کلاس QAbstractNetworkCache در Qt
مقدمه
در دنیای برنامه نویسی شبکه، مدیریت داده های کش شده از اهمیت بالایی برخوردار است. Qt، چارچوب قدرتمند توسعه نرم افزار، کلاس QAbstractNetworkCache را ارائه می دهد که به عنوان پایه ای برای پیاده سازی انواع مختلف مکانیزم های کش شبکه عمل می کند. این کلاس به توسعه دهندگان اجازه می دهد تا به صورت سفارشی و انعطاف پذیر، داده های دریافتی از شبکه را ذخیره کرده و در صورت نیاز، از نسخه های ذخیره شده استفاده کنند.
چه کاری انجام می دهد؟
کلاس QAbstractNetworkCache یک کلاس انتزاعی است که عملیات پایه ای مورد نیاز برای یک سیستم کش شبکه را تعریف می کند. این عملیات شامل موارد زیر است:
- ذخیره داده ها: داده های دریافتی از شبکه را در یک مکان مشخص ذخیره می کند.
- بازیابی داده ها: داده های ذخیره شده را بر اساس یک کلید مشخص بازیابی می کند.
- حذف داده ها: داده های منقضی شده یا غیر ضروری را از حافظه کش حذف می کند.
- بررسی اعتبار داده ها: اعتبار داده های ذخیره شده را بررسی می کند تا اطمینان حاصل شود که داده ها هنوز معتبر هستند.
چرا از آن استفاده کنیم؟
- بهبود عملکرد: با ذخیره داده های پرکاربرد در حافظه کش، زمان بارگذاری صفحات وب و سایر منابع شبکه به طور قابل توجهی کاهش می یابد.
- کاهش ترافیک شبکه: با کاهش تعداد درخواست های ارسال شده به سرور، ترافیک شبکه کاهش یافته و پهنای باند صرفه جویی می شود.
- کارایی آفلاین: برخی از برنامه ها می توانند حتی در حالت آفلاین نیز به داده های کش شده دسترسی داشته باشند.
- انعطاف پذیری: کلاس
QAbstractNetworkCacheبه توسعه دهندگان اجازه می دهد تا مکانیزم های کش سفارشی خود را ایجاد کنند.
چگونه کار می کند؟
کلاس QAbstractNetworkCache یک رابط تعریف می کند که توسط کلاس های مشتق شده باید پیاده سازی شود. این کلاس های مشتق شده، الگوریتم های مختلفی را برای مدیریت حافظه کش پیاده سازی می کنند. برای مثال، برخی از کلاس های مشتق شده ممکن از یک پایگاه داده برای ذخیره داده ها استفاده کنند، در حالی که برخی دیگر ممکن است از فایل های سیستم استفاده کنند.
کاربردها
- برنامه های مرورگر وب: برای ذخیره صفحات وب، تصاویر و سایر منابع استاتیک.
- برنامه های دانلود فایل: برای ذخیره فایل های دانلود شده به صورت موقت.
- برنامه های پخش کننده رسانه: برای ذخیره قطعات رسانه ای به منظور پخش روان تر.
- برنامه های ارتباطی: برای ذخیره پیام های چت و سایر داده های ارتباطی.
مزایای استفاده از QAbstractNetworkCache
- سادگی استفاده: کلاس
QAbstractNetworkCacheیک رابط ساده و آسان برای استفاده را ارائه می دهد. - انعطاف پذیری: به توسعه دهندگان اجازه می دهد تا مکانیزم های کش سفارشی خود را ایجاد کنند.
- کارایی بالا: بسیاری از پیاده سازی های کلاس
QAbstractNetworkCacheبسیار کارآمد هستند. - پشتیبانی از چندین پلتفرم: Qt یک چارچوب چند پلتفرمی است و بنابراین کلاس
QAbstractNetworkCacheنیز در چندین پلتفرم قابل استفاده است.
نتیجه گیری
کلاس QAbstractNetworkCache یک ابزار قدرتمند برای توسعه دهندگانی است که می خواهند برنامه های شبکه ای خود را بهینه سازی کنند. با استفاده از این کلاس، می توانید به راحتی یک سیستم کش شبکه سفارشی ایجاد کنید که نیازهای برنامه شما را برآورده کند.
| Header: | #include <QAbstractNetworkCache> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake: | QT += network |
| Inherits: | QObject |
| Inherited By: |
متدهای عمومی:
| virtual | ~QAbstractNetworkCache() |
| virtual qint64 | cacheSize() const = 0 |
| virtual QIODevice * | data(const QUrl &url) = 0 |
| virtual void | insert(QIODevice *device) = 0 |
| virtual QNetworkCacheMetaData | metaData(const QUrl &url) = 0 |
| virtual QIODevice * | prepare(const QNetworkCacheMetaData &metaData) = 0 |
| virtual bool | remove(const QUrl &url) = 0 |
| virtual void | updateMetaData(const QNetworkCacheMetaData &metaData) = 0 |
اسلات های عمومی:
| virtual void | clear() = 0 |
توضیح کامل
QAbstractNetworkCache یک کلاس پایه انتزاعی در Qt است که به عنوان بنیان برای هر نوع کش استاندارد مورد استفاده توسط QNetworkAccessManager عمل می کند. این کلاس به عنوان یک کلاس انتزاعی تعریف شده است و به طور مستقیم قابل نمونه سازی نیست.
مستندات عملکرد اعضا
QAbstractNetworkCache::QAbstractNetworkCache(QObject*parent = nullptr)
توضیحات:
- این سازنده، یک شیء جدید از نوع
QAbstractNetworkCacheایجاد می کند. - آرگومان
parentیک اشاره گر به شیء والد است. اگرparentغیر صفر باشد، این شیء به عنوان فرزندparentدر درخت شیء Qt اضافه می شود. این باعث می شود که شیء به طور خودکار حذف شود زمانی کهparentحذف شود. اگرparentصفر باشد، این شیء بدون والد ایجاد می شود.
پارامترها:
- parent: یک اشاره گر به شیء والد اختیاری. اگر
parentغیر صفر باشد، این شیء به عنوان فرزندparentدر درخت شیء Qt اضافه می شود.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
[virtual noexcept] QAbstractNetworkCache::~QAbstractNetworkCache()
چه کاری انجام میدهد؟
این خط کد در زبان برنامهنویسی C++ و در چارچوب Qt به تخریبگر (destructor) کلاس QAbstractNetworkCache اشاره دارد. تخریبگر یک متد خاص در کلاسها است که به صورت خودکار زمانی که یک شیء از آن کلاس از حافظه پاک میشود فراخوانی میشود.
به طور خلاصه، این تخریبگر وظیفه دارد:
- پاکسازی منابع: تمامی منابعی که توسط شیء
QAbstractNetworkCacheاشغال شدهاند (مانند حافظه، فایلهای موقت و …) را آزاد کند. - اطمینان از عدم نشت حافظه: اطمینان حاصل کند که هیچ بخشی از حافظه به دلیل عدم آزادسازی منابع به صورت نشت یافته باقی نماند.
- انجام عملیات پاکسازی نهایی: هر گونه عملیات پاکسازی دیگری که برای اطمینان از وضعیت پایدار شیء پس از تخریب لازم باشد را انجام دهد.
تجزیه و تحلیل اجزای کد
virtual: این کلمه کلیدی نشان میدهد که این متد میتواند در کلاسهای مشتق شده بازنویسی شود. این به این معنی است که کلاسهای مشتق شده ازQAbstractNetworkCacheمیتوانند رفتار متفاوتی برای عملیات تخریب تعریف کنند.noexcept: این کلمه کلیدی تضمین میکند که این متد هیچ استثنایی پرتاب نخواهد کرد. این بسیار مهم است زیرا اگر یک تخریبگر استثنا پرتاب کند، ممکن است منجر به نشت حافظه یا رفتارهای غیرمنتظره دیگری شود.~QAbstractNetworkCache(): این نام متد است که نشان میدهد این تخریبگر مخصوص کلاسQAbstractNetworkCacheاست.
چرا مهم است؟
- جلوگیری از نشت حافظه: یکی از مهمترین دلایل استفاده از تخریبگرها اطمینان از آزادسازی صحیح حافظه است. اگر منابعی که توسط یک شیء اشغال شدهاند به درستی آزاد نشوند، منجر به نشت حافظه و در نهایت به کند شدن برنامه یا حتی خرابی آن میشود.
- تضمین وضعیت پایدار: تخریبگرها اطمینان حاصل میکنند که شیء پس از تخریب در یک وضعیت پایدار قرار دارد و هیچ منبعی به صورت باز باقی نمیماند.
- پشتیبانی از سلسله مراتب کلاسها: با استفاده از کلمه کلیدی
virtual، کلاسهای مشتق شده میتوانند رفتار تخریب را سفارشی کنند و عملیات پاکسازی خاص خود را انجام دهند.
qint64 QAbstractNetworkCache::cacheSize() const
توضیحات:
- این تابع یک تابع مجازی خالص (pure virtual) در کلاس
QAbstractNetworkCacheاست. - وظیفه آن بازگرداندن اندازه فعلی حافظه کش است.
- اندازه حافظه کش معمولاً به واحد بایت محاسبه میشود.
- این تابع در کلاسهای مشتق شده از
QAbstractNetworkCacheباید پیادهسازی شود تا عملکرد صحیحی داشته باشد.
بازگشت:
- یک عدد صحیح 64 بیتی (qint64) که نشاندهنده اندازه حافظه کش فعلی است. اگر اندازه حافظه کش نامشخص است، مقدار -1 بازگردانده میشود.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache); qint64 size = cache->cacheSize();
qDebug() << “Cache size:“ << size << “bytes“;
در این مثال، اندازه حافظه کش فعلی با استفاده از تابع cacheSize() به دست میآید و در خروجی چاپ میشود.
نکات مهم:
- اندازه حافظه کش میتواند در طول زمان تغییر کند، زیرا دادههای جدید به کش اضافه میشوند و دادههای قدیمی حذف میشوند.
- برخی از پیادهسازیهای کش ممکن است اندازه حافظه کش را به صورت دقیق محاسبه نکنند یا ممکن است اندازه را به صورت تخمینزده گزارش دهند.
استفاده:
این تابع برای تعیین میزان استفاده از حافظه کش و تصمیمگیری در مورد نیاز به پاکسازی یا تغییر اندازه حافظه کش استفاده میشود.
همچنین میتواند برای نظارت بر عملکرد برنامه و بررسی میزان استفاده از منابع شبکه مفید باشد.
void QAbstractNetworkCache::clear()
توضیحات:
- این تابع یک تابع مجازی خالص (pure virtual) در کلاس
QAbstractNetworkCacheاست. - وظیفه آن پاک کردن کامل حافظه کش و حذف تمام دادههای ذخیره شده است.
- این تابع در کلاسهای مشتق شده از
QAbstractNetworkCacheباید پیادهسازی شود تا عملکرد صحیحی داشته باشد.
پارامترها:
- ندارد.
بازگشت:
- ندارد.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
// … استفاده از کش …
cache->clear(); qDebug() << “Cache cleared.“;
در این مثال، حافظه کش با استفاده از تابع clear() پاک میشود و پیامی در خروجی چاپ میشود.
نکات مهم:
- پس از پاک کردن حافظه کش، تمام دادههای ذخیره شده در آن حذف میشوند و برای دسترسی مجدد باید مجدداً از شبکه بارگذاری شوند.
- این تابع معمولاً برای آزاد کردن حافظه یا پاکسازی دادههای قدیمی و غیر ضروری استفاده میشود.
- بسته به پیادهسازی کش، ممکن است این تابع زمانبر باشد، به خصوص اگر حافظه کش بزرگ باشد.
استفاده:
- این تابع برای مدیریت اندازه حافظه کش و جلوگیری از پر شدن بیش از حد آن استفاده میشود.
- همچنین میتواند برای پاکسازی دادههای قدیمی یا غیر ضروری یا برای شروع مجدد برنامه با یک حافظه کش خالی استفاده شود.
QIODevice *QAbstractNetworkCache::data(const QUrl &url)
توضیحات:
- این تابع یک تابع مجازی در کلاس
QAbstractNetworkCacheاست. - وظیفه آن بازگرداندن یک شیء
QIODeviceکه به دادههای ذخیره شده در کش برای آدرس اینترنتی مشخص شده اشاره میکند. - اگر دادههای ذخیره شده برای آدرس اینترنتی وجود نداشته باشد،
nullptrبازگردانده میشود.
پارامترها:
- url: یک شیء
QUrlکه آدرس اینترنتی مورد نظر را نشان میدهد.
بازگشت:
- یک اشاره گر به یک شیء
QIODeviceکه به دادههای ذخیره شده در کش اشاره میکند، یاnullptrاگر دادههای ذخیره شده وجود نداشته باشد.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
QUrl url(“https://www.example.com/image.jpg“);
QIODevice *device = cache->data(url);
if (device) {
// دادهها وجود دارند، میتوانید آنها را بخوانید
QByteArray data = device->readAll();
device->close();
} else {
// دادهها وجود ندارند، باید آنها را از شبکه بارگذاری کنید
// …
}
void QAbstractNetworkCache::insert(QIODevice *device)
توضیحات:
- این تابع یک تابع مجازی در کلاس
QAbstractNetworkCacheاست. - وظیفه آن اضافه کردن دادههای موجود در شیء
QIODeviceبه حافظه کش. - آدرس اینترنتی دادهها از ویژگی
url()شیءQIODeviceاستخراج میشود.
پارامترها:
- device: یک اشاره گر به یک شیء
QIODeviceکه حاوی دادههایی است که باید به حافظه کش اضافه شود.
بازگشت:
- ندارد.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
QUrl url(“https://www.example.com/image.jpg“);
QNetworkReply *reply = manager.get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, [reply, cache] {
if (reply->error() == QNetworkReply::NoError) {
QIODevice *device = reply->open(QIODevice::ReadOnly);
if (device) {
cache->insert(device);
device->close();
}
}
reply->deleteLater();
});
نکات مهم:
- شیء
QIODeviceباید پس از اضافه کردن دادهها به حافظه کش بسته شود تا منابع سیستم آزاد شوند. - اگر دادههای ذخیره شده در کش تغییر کنند، ممکن است لازم باشد حافظه کش را پاک کنید و مجدداً دادهها را از شبکه بارگذاری کنید.
- این تابع معمولاً برای ذخیره دادههای دانلود شده از شبکه در حافظه کش استفاده میشود.
استفاده:
- این تابع برای ذخیره دادههای دانلود شده از شبکه در حافظه کش و استفاده مجدد از آنها در آینده استفاده میشود.
- همچنین میتواند برای ایجاد یک حافظه کش سفارشی و ذخیره دادههای دلخواه استفاده شود.
QNetworkCacheMetaData QAbstractNetworkCache::metaData(const QUrl &url)
توضیحات:
- این تابع یک تابع مجازی در کلاس
QAbstractNetworkCacheاست. - وظیفه آن بازگرداندن متادیتای ذخیره شده برای آدرس اینترنتی مشخص شده.
- متادیتا شامل اطلاعاتی مانند زمان آخرین بارگذاری، تاریخ انقضا و سایر اطلاعات مرتبط با دادههای ذخیره شده است.
- اگر متادیتا برای آدرس اینترنتی وجود نداشته باشد،
QNetworkCacheMetaData()بازگردانده میشود.
پارامترها:
- url: یک شیء
QUrlکه آدرس اینترنتی مورد نظر را نشان میدهد.
بازگشت:
- یک شیء
QNetworkCacheMetaDataکه حاوی متادیتای ذخیره شده برای آدرس اینترنتی است.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
QUrl url(“https://www.example.com/image.jpg“);
QNetworkCacheMetaData metaData = cache->metaData(url);
if (!metaData.isNull()) {
qDebug() << “Last modified:” << metaData.lastModified();
qDebug() << “Expires:” << metaData.expires();
} else {
// متادیتا وجود ندارد
}
نکات مهم:
- متادیتا میتواند برای تعیین اینکه آیا دادههای ذخیره شده هنوز معتبر هستند یا نیاز به بارگذاری مجدد از شبکه دارند استفاده شود.
- بسته به پیادهسازی کش، ممکن است برخی از فیلدهای متادیتا پشتیبانی نشوند.
استفاده:
- این تابع برای بررسی متادیتای ذخیره شده برای آدرس اینترنتی و تصمیمگیری در مورد نیاز به بارگذاری مجدد از شبکه استفاده میشود.
- همچنین میتواند برای نظارت بر تاریخ انقضای دادههای ذخیره شده در کش و پاکسازی دادههای قدیمی و غیر ضروری استفاده شود.
QIODevice *QAbstractNetworkCache::prepare(const QNetworkCacheMetaData &metaData)
توضیحات:
- این تابع یک تابع مجازی در کلاس
QAbstractNetworkCacheاست. - وظیفه آن ایجاد یک شیء
QIODeviceکه برای نوشتن دادهها به حافظه کش استفاده میشود. - متادیتای دادهها در شیء
QNetworkCacheMetaDataمشخص شده است. - شیء
QIODeviceبازگردانده شده باید بسته شود تا منابع سیستم آزاد شوند.
پارامترها:
- metaData: یک شیء
QNetworkCacheMetaDataکه حاوی متادیتای دادههایی است که باید به حافظه کش اضافه شوند.
بازگشت:
- یک اشاره گر به یک شیء
QIODeviceکه برای نوشتن دادهها به حافظه کش استفاده میشود. اگر ایجاد شیءQIODeviceبا مشکل مواجه شود،nullptrبازگردانده میشود.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
QUrl url(“https://www.example.com/image.jpg“);
QNetworkCacheMetaData metaData;
metaData.setUrl(url);
metaData.setLastModified(QDateTime::currentDateTime());
metaData.setExpires(QDateTime::currentDateTime().addDays(7));
QIODevice *device = cache->prepare(metaData);
if (device) {
// دادهها را به شیء `QIODevice` بنویسید
device->write(“data to be cached“);
device->close();
} else {
// ایجاد شیء `QIODevice` با مشکل مواجه شد
}
نکات مهم:
- شیء
QIODeviceبازگردانده شده باید بسته شود تا منابع سیستم آزاد شوند. - اگر ایجاد شیء
QIODeviceبا مشکل مواجه شود،nullptrبازگردانده میشود و دادهها به حافظه کش اضافه نمیشوند. - این تابع معمولاً برای نوشتن دادهها به حافظه کش استفاده میشود، به خصوص زمانی که میخواهید متادیتای دادهها را نیز ذخیره کنید.
استفاده:
- این تابع برای نوشتن دادهها به حافظه کش و ذخیره متادیتای آنها استفاده میشود.
- همچنین میتواند برای ایجاد یک حافظه کش سفارشی و ذخیره دادههای دلخواه استفاده شود.
bool QAbstractNetworkCache::remove(const QUrl &url)
توضیحات:
- این تابع یک تابع مجازی در کلاس
QAbstractNetworkCacheاست. - وظیفه آن حذف دادههای ذخیره شده برای آدرس اینترنتی مشخص شده از حافظه کش.
- اگر دادههای ذخیره شده وجود داشته باشند،
trueبازگردانده میشود، در غیر این صورتfalseبازگردانده میشود.
پارامترها:
- url: یک شیء
QUrlکه آدرس اینترنتی مورد نظر را نشان میدهد.
بازگشت:
trueاگر دادههای ذخیره شده حذف شده باشند، در غیر این صورتfalse.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
QUrl url(“https://www.example.com/image.jpg“);
bool removed = cache->remove(url);
if (removed) {
qDebug() << “Data removed from cache.“;
} else {
qDebug() << “Data not found in cache.“;
}
نکات مهم:
- این تابع معمولاً برای حذف دادههای قدیمی یا غیر ضروری از حافظه کش استفاده میشود.
- اگر دادههای ذخیره شده حذف شوند، دفعه بعد که به آنها نیاز باشد، باید مجدداً از شبکه بارگذاری شوند.
استفاده:
- این تابع برای مدیریت اندازه حافظه کش و جلوگیری از پر شدن بیش از حد آن استفاده میشود.
- همچنین میتواند برای پاکسازی دادههای قدیمی یا غیر ضروری یا برای شروع مجدد برنامه با یک حافظه کش خالی استفاده شود.
void QAbstractNetworkCache::updateMetaData(const QNetworkCacheMetaData &metaData)
توضیحات:
- این تابع یک تابع مجازی در کلاس
QAbstractNetworkCacheاست. - وظیفه آن بهروزرسانی متادیتای ذخیره شده برای دادههای مرتبط با آدرس اینترنتی مشخص شده.
- آدرس اینترنتی در شیء
QNetworkCacheMetaDataمشخص شده است.
پارامترها:
- metaData: یک شیء
QNetworkCacheMetaDataکه حاوی متادیتای جدید برای دادههای ذخیره شده است.
بازگشت:
- ندارد.
مثال C++:
QNetworkAccessManager manager;
QNetworkDiskCache *cache = new QNetworkDiskCache(&manager);
manager.setCache(cache);
QUrl url(“https://www.example.com/image.jpg“);
QNetworkCacheMetaData metaData = cache->metaData(url);
// بهروزرسانی تاریخ انقضا
metaData.setExpires(QDateTime::currentDateTime().addDays(30));
cache->updateMetaData(metaData);
نکات مهم:
- این تابع معمولاً برای بهروزرسانی اطلاعات مانند تاریخ انقضا یا سایر متادیتای مرتبط با دادههای ذخیره شده استفاده میشود.
- اگر متادیتای ذخیره شده وجود نداشته باشد، این تابع هیچ تغییری ایجاد نمیکند.
استفاده:
- این تابع برای مدیریت تاریخ انقضای دادههای ذخیره شده در کش و جلوگیری از استفاده از دادههای قدیمی و غیر ضروری استفاده میشود.
- همچنین میتواند برای بهروزرسانی سایر اطلاعات مرتبط با دادههای ذخیره شده استفاده شود.
با توجه به توضیحاتی که در مورد کلاسهای QAbstractNetworkCache و توابع مختلف آن ارائه شد، میتوانیم به این نتیجه برسیم که این کلاسها نقش بسیار مهمی در مدیریت حافظه پنهان (Cache) در برنامههای شبکهای مبتنی بر Qt ایفا میکنند.
در اینجا خلاصهای از نکات کلیدی و اهمیت این کلاسها آورده شده است:
- بهبود کارایی: با ذخیره دادههای دانلود شده در حافظه پنهان، میتوان از بارگذاری مجدد آنها از شبکه جلوگیری کرده و به طور قابل توجهی سرعت پاسخگویی برنامه را افزایش داد.
- کاهش مصرف پهنای باند: با استفاده از حافظه پنهان، میتوان از ارسال درخواستهای تکراری به سرور جلوگیری کرده و در نتیجه مصرف پهنای باند را کاهش داد.
- تجربه کاربری بهتر: با بارگذاری سریعتر صفحات وب و سایر منابع، تجربه کاربری برای کاربران بهبود مییابد.
- انعطافپذیری: کلاس
QAbstractNetworkCacheبه توسعهدهندگان اجازه میدهد تا انواع مختلفی از حافظه پنهان را پیادهسازی کنند و به نیازهای خاص برنامه خود پاسخ دهند.
در نهایت، میتوان گفت که درک عمیق از کلاسهای QAbstractNetworkCache و نحوه استفاده از آنها، برای توسعهدهندگانی که قصد دارند برنامههای شبکهای کارآمد و با کارایی بالا ایجاد کنند، بسیار ضروری است.
20,000,000 تومان قیمت اصلی: 20,000,000 تومان بود.4,990,000 تومانقیمت فعلی: 4,990,000 تومان.
5,000,000 تومان قیمت اصلی: 5,000,000 تومان بود.499,000 تومانقیمت فعلی: 499,000 تومان.
1,200,000 تومان قیمت اصلی: 1,200,000 تومان بود.145,000 تومانقیمت فعلی: 145,000 تومان.