السلام عليكم بسم الله الرحمن الرحيم دوال المستوى العالي لبرمجة تطبيقات متعددة المسالك :- يمكنك الآن نسيان جميع ماسبق عن تعدد المسالك , إذا كنت قد مللت من الوراثة من فئات وبرمجة سطور كثيرة لتحصل على تطبيق متعددة المسالك فإنك بإمكانك القاء هذه المعاناة الى الماضي والبدء مع دوال المستوى العالي لبرمجة تطبيقات متعددة المسالك . فضاء الأسماء QtConcurrent:- توفر لك دوال المستوى العالي امكانية عمل برامج متعددة المسالك بدون إستخدام فئات ودوال وتقنيات ذات مستوى منخفض مثل الإقصاء المتبادل أو الإقفال للقراءة أو الكتابة او حالة الغنتظار أو حتى semaphore . التطبيقات المكتوبة بواسطة QtConcurrent تقوم بتعديل عدد مسالكها وفقا للمتوفر في المعالجات الأساسية . وأبسط هذه الدوال هي QtConcurrent::run() التي تستقبل مؤشر لدالة تقوم بتنفيذها في مسلك مختلف وسوف يكون مدار بواسطة QthreadPool الرئيسي (راجع المقال السابق) أنظر المثال :-
1. #include <QtGui>2. void myThread(){3. for(int i=0;i<=10;i++)4. qDebug()<<"1";5. }6. int main(int argc, char *argv[])7. {8. QApplication a(argc, argv);9. QtConcurrent::run(myThread);10. QMessageBox::information(&w,"multi-threading","run");11. return a.exec();12. }
1. #include <QtGui>2. void print(QString str)3. {4. qDebug() <<str;5. }6. int main(int argc, char *argv[])7. {8. QApplication app(argc, argv);9. QStringListstr;10. str<<"Qt-ar"<<"msfofa"<<"sudanix"<<11. "arabTeam"<<"mohammmed alabdaly";12. QtConcurrent::blockingMap(str,print);13. return 0;14. }
1. #include <QtGui>2. QString myThread(){3. return "www.qt-ar.com";4. }5. int main(int argc, char *argv[])6. {7. QApplication a(argc, argv);8. QFuture<QString>future=QtConcurrent::run(myThread);9. future.waitForFinished();10. qDebug()<<future.result();11. return 0;12. }
1. #include <QtGui>2. using namespace QtConcurrent;3. const int iterations = 20;4. void spin(int &iteration)5. {6. const int work = 1000 * 1000 * 40;7. volatile int v = 0;8. for (int j = 0; j < work; ++j)9. ++v;10. qDebug() << "iteration" << iteration << "in thread" << QThread::currentThreadId();11. }12. int main(int argc, char **argv)13. {14. QApplication app(argc, argv);15. QVector<int> vector;16. for (int i = 0; i < iterations; ++i)17. vector.append(i);18. QProgressDialog dialog;19. dialog.setLabelText(QString("Progressing using %1 thread(s)...").arg(QThread::idealThreadCount()));20. QFutureWatcher<void> futureWatcher;21. QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));22. QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));23. QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int, int)), &dialog, SLOT(setRange(int, int)));24. QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));25. futureWatcher.setFuture(QtConcurrent::map(vector, spin));26. dialog.exec();27. futureWatcher.waitForFinished();28. }
1. // keep only images with an alpha channel2. QList<QImage> images = ...;3. QFuture<void> alphaImages = QtConcurrent::filter(strings, &QImage::hasAlphaChannel);4. // keep only gray scale images5. QList<QImage> images = ...;6. QFuture<QImage> grayscaleImages = QtConcurrent::filtered(images, &QImage::isGrayscale);