moveToThread
इस्तेमाल करते हुए हम एक वस्तु का धागा आत्मीयता बदल सकते हैं:
यह है कि ब्लॉग से सरल कोड है। ओपी पूछता है कि हम अलग-अलग धागे में एक ही कक्षा के दो कार्यों को कैसे चला सकते हैं।
Let वर्ग A
और दो कार्यों f1
और f2
class A
{
public:
void f1();
void f2(int i);
void run(); // shows how we can trigger f1 and f2 in different threads
}
Qt
पहले से ही अलग धागे में कार्यों को चलाने के लिए एक वर्ग प्रदान की है और यह QtConcurrentRun
कहा जाता है QtConcurrent::run()
समारोह एक में एक समारोह चलाता है अलग धागा फ़ंक्शन का वापसी मूल्य QFuture
API के माध्यम से उपलब्ध कराया गया है।
ट्रिगर किया गया फ़ंक्शन या तो बाहरी फ़ंक्शन या सदस्य फ़ंक्शन हो सकता है। इसलिए हमारे मामले में हम f1
और विभिन्न धागे में f2
शुरू करने के लिए वस्तु से ही चाहते थे कि अगर हम run()
void run()
{
// QFuture<void> because f1 is void
QFuture<void> future1 = QtConcurrent::run(this, &A::f1);
int k = 5; // Concurrent run with arguments
QFuture<void> future2 = QtConcurrent::run(this, &A::f2, k);
}
में निम्नलिखित कर सकता है इसी तरह आप समवर्ती किसी भी वर्ग के किसी भी सार्वजनिक समारोह, जैसे
QImage image = ...;
QFuture<void> future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba);
A a;
QFuture<void> future1 = QtConcurrent::run(A, &A::f1);
पर अमल कर सकता है
सूचना दो कॉल के बीच अंतर:
QtConcurrent::run()
भी सदस्य के कामकाज की ओर इशारा स्वीकार करता है ऑन। पहला तर्क क्लास के उदाहरण के लिए या तो एक कॉन्स्ट संदर्भ या सूचक होना चाहिए। कॉलिंग कॉन्स सदस्य फ़ंक्शंस जब कॉन्स्ट संदर्भ द्वारा पास करना उपयोगी होता है; पॉइंटर द्वारा गुजरना के लिए उपयोगी है जो गैर-कॉन्स्ट सदस्य फ़ंक्शन को कॉल करता है जो उदाहरण को संशोधित करता है।
एक समवर्ती रूप से निष्पादित फ़ंक्शन समाप्त होने पर जांचने के लिए आपको QFutureWatcher
का उपयोग करना चाहिए।
संबंधित: [QThread मुख्य अनुप्रयोग अवरुद्ध करना] (http://stackoverflow.com/questions/3213738/) –