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
Düşünebildiğim tek şey eklemek QObject
s 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. QObject
s 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
Tek örnek bir uygulama oluşturmak için...
Koşullu bir sınıf uygulamak için en iy...
Bir ağaca doğru düz bir masa ayrıştırm...
Java sabitler uygulamak için en iyi yo...
Sınıf elemanları sayım Jquery bunu uyg...