SORU
4 Kasım 2010, PERŞEMBE


bir QThread... (örnek lütfen...)uygulamak için doğru yolu nedir

QThread için Qt belgelerini QThread bir sınıf oluşturmak için, ve çalışma yöntemini uygulamak için diyor.

Aşağıda 4.7 Qthread belgelerine alınır...

Kendi konu, alt QThread ve yeniden gerçeklemek oluşturma çalışması(). Örneğin:

 class MyThread : public QThread
 {
 public:
     void run();
 };

 void MyThread::run()
 {
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
 }

Bu yüzden her bir iplik ettim oluşturulan yaptım sadece o ve çoğu şey çalışıyor güzel film değil uygulamak moveToThread(bu) benim nesneleri ve harika çalışıyor).

Bir Budak geçen hafta (benim nesneleri oluşturdum yerde çalışarak geçmeyi başardı) vurdum ve following blog post bulundu. Burada temel olarak sınıflara QThread gerçekten bunu yapmak için doğru bir yolu (ve belgelere yanlış olan bir şey yok diyor.

Bu Qt geliştirici geliyor ilk bakışta ilgi ve daha fazla yansıması üzerine, ona katılıyorum. OO ilkelerini takip eden, gerçekten sadece daha fazla sınıf geliştirmek için bir sınıf... sadece sınıflar yöntemleri doğrudan kullanmak için değil... örneğini bu yüzden alt sınıf için

Bu bir iş parçacığı için özel QObject bir sınıf hareket... istedim diyelim ki 'doğru' bu işin yolu? Bu blog yazısı, o diyor ki' örnek bir yerlerde... ama eğer biri daha bana bunu açıklayabilir eğer büyük takdir olurdu!

Güncelleme:

Bu soru çok fazla dikkat çekiyor beri burada olan 4.8 belgeleri kopyalama ve yapıştırma 'uygun' bir QThread uygulamak.

class Worker : public QObject
 {
     Q_OBJECT
     QThread workerThread;

 public slots:
     void doWork(const QString ¶meter) {
         // ...
         emit resultReady(result);
     }

 signals:
     void resultReady(const QString &result);
 };

 class Controller : public QObject
 {
     Q_OBJECT
     QThread workerThread;
 public:
     Controller() {
         Worker *worker = new Worker;
         worker->moveToThread(&workerThread);
         connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
         connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));
         connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString)));
         workerThread.start();
     }
     ~Controller() {
         workerThread.quit();
         workerThread.wait();
     }
 public slots:
     void handleResults(const QString &);
 signals:
     void operate(const QString &);
 };

Ben hala gereksiz olduğunu ve asla onların örnekte kullanılan Worker::workerThread fazladan bir üyesi olup olmadığına işaret etmek faydalı olduğuna inanıyorum. Bu parça kaldırmak ve Qt parçacıkları yapmak için ne kadar uygun bir örnektir.

CEVAP
4 Kasım 2010, PERŞEMBE


Düşünebildiğim tek şey eklemek QObjects tek bir iş parçacığı ile bir yakınlık var daha fazla devlet. Bu genellikle QObject oluşturan iplik. Uygulamanın ana iş parçacığı QObject oluşturun ve başka bir iş parçacığı kullanmak istiyorsanız, moveToThread() benzeşim değiştirmek için kullanın.

Bu QThread alt olması ve run() yöntemi nesneleri oluşturmak, böylece eşyalarını güzelce saklanmış tutmak kaydeder.

Bu blog yazısı example bir bağlantı içerir. Ama temel fikir oldukça kısa gösterir. QObjects oluşturmak, sinyalleri bağlayın QThread ** 12, QObjects oluşturun ve iş parçacığı başlatın. Sinyal/slot mekanizmaları parçacığı sınırları düzgün ve güvenli bir şekilde geçti sağlayacaktır.

Eğer bir nesne üzerinde yöntem çağrısı varsa senkronizasyon tanıtmak için bu mekanizma dışında olabilir.

Qt muhtemelen aşina olmaya değer konuları ama henüz bunu yapmak için var:) ötesinde threading facilities başka güzel olduğunu biliyorum

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010
  • Pituvision

    Pituvision

    11 Mart 2006
  • Yo Mama

    Yo Mama

    18 EYLÜL 2005