سؤال

لدي الرئيسية مؤشر ترابط استدعاء الطفل موضوع وظيفة في أوقات مختلفة ولكن لست متأكدا إذا كان هذا هو الطريق الصحيح للقيام بذلك في كيو تي.ما هو الخطأ مع رمز أدناه و تبحث عن بديل أفضل

هناك الرئيسي القاسم infinitly أي وقت مضى عندما الترابط الرئيسي تطلق قفل الطفل قطعة من العمل.

#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread> 
QSemaphore sem(0);
class Background : public QThread 
{
protected:
void run() 
{ 
for(;;)
{ 
   sem.acquire(1); 
   qDebug("Child function ran");
} 
} 
};

int main(int argc, char *argv[])  
{   
QCoreApplication a(argc, argv);   
Background child; 
child.start();
qDebug("Main running"); 
qDebug("release a lock");
sem.release(1);
qDebug("Do somework in main");   
//call child
sem.release(1);
sem.release(1);
return a.exec();  
}
هل كانت مفيدة؟

المحلول

تحرير: إعادة صياغة كاملة بعد تغطية أساسيات كذلك.

Background.h:

#ifndef BACKGROUND_H
#define BACKGROUND_H

#include <QThread>
#include <QObject>

class Background : public QThread 
{
Q_OBJECT
public:
   Background(QObject* parent = 0):QThread(parent){}
protected:
   void run()
   {
      qDebug(qPrintable(QString("Child function ran in thread: %1").arg(QThread::currentThreadId())));
   }
};

class BackgroundConcurrent : public QObject
{
Q_OBJECT
public:
   BackgroundConcurrent(QObject* parent = 0):QObject(parent){}
public slots:
   void doWork() const
   {
      qDebug(qPrintable(QString("Concurrent child function ran in thread: %1").arg(QThread::currentThreadId())));
   }
};

class BackgroundTrigger : public QObject
{
Q_OBJECT
public:
   BackgroundTrigger(QObject* parent = 0):QObject(parent){}
   ~BackgroundTrigger()
   {
      foreach(QObject* child, children())
      {
         QThread* childThread = qobject_cast<QThread*>(child);
         if (childThread)
            childThread->wait();
      }
   }
public slots:
   void triggerWorker()
   {
      Background* child = new Background(this);
      child->start();
   }
};

#endif // BACKGROUND_H

main.cpp:

#include "Background.h"

#include <QCoreApplication>
#include <QtConcurrentRun>

int main(int argc, char *argv[])  
{   
QCoreApplication a(argc, argv);   

// Using QThread
BackgroundTrigger childTrigger;
qDebug(qPrintable(QString("Main function ran in thread: %1").arg(QThread::currentThreadId())));

// Call child
childTrigger.triggerWorker();
childTrigger.triggerWorker();

// Using QtConcurrent
BackgroundConcurrent cchild;
QFuture<void> future1 = QtConcurrent::run(&cchild, &BackgroundConcurrent::doWork);
QFuture<void> future2 = QtConcurrent::run(&cchild, &BackgroundConcurrent::doWork);

return 0;
}

عينة الإخراج:

Main function ran in thread: 1087038064
Child function ran in thread: 1091267472
Child function ran in thread: 1093417872
Concurrent child function ran in thread: 1095519120
Concurrent child function ran in thread: 1097644944

تأكد من تشغيل وزارة التجارة على رأس الملفات ، qmake و cmake سواء دعم إنشاء makefiles.

هنا CMakeLists.txt الملف لا تستخدم لبناء البرمجية:

cmake_minimum_required(VERSION 2.6)

#Project name
project(TEST)

#Use Qt4
find_package(Qt4)

if(QT4_FOUND)
set(QT_USE_QTOPENGL TRUE)
include(${QT_USE_FILE})

set(LIBS
    ${QT_LIBRARIES}
    )

#Source files (*.cpp, *.o)
set(TEST_SRCS main.cpp)

#Header files (*.h[pp])
set(TEST_HDRS Background.h)

#Qt macros to handle uic, moc, etc...
QT4_WRAP_CPP(TEST_MOC ${TEST_HDRS} OPTIONS -nw)

set(TEST_ALLSRC ${TEST_SRCS} ${TEST_MOC})

#Create main
add_executable(test ${TEST_ALLSRC})
target_link_libraries(test ${LIBS})

endif(QT4_FOUND)

نصائح أخرى

والواقع الحل الحالي لهذه المشكلة هو الى حد بعيد لطيفة الإختراق.

إذا كنت تفضل أن تفعل ذلك بطريقة "أنظف"، يجب أن تبدأ حلقة الحدث في ترابط العامل الخاص بك. ثم مؤشر ترابط عامل سوف تكون قادرة على استقبال إشارات من الخيط الرئيسي. هل يمكن استدعاء دالة في موضوع الطفل (باستخدام آلية إشارة / فتحة) من الخيط الرئيسي لتحريك العملية.

وانظر هنا لمزيد من التفاصيل: http://doc.trolltech.com/4.2/threads. أتش تي أم أل # لكل موضوع الحدث حلقة

و(تلميح: الفكرة الأساسية هي أن تقوم بإنشاء الكائن المتلقي في موضوع العمال، ثم سيتم معالجة فتحات في هذا الموضوع، أو يمكنك استخدام MoveToThread () وظيفة)

ويبدو أنك قد ترغب في استخدام إشارة لذلك، لتتناسب مع نمط كيو تي العادي. تحقق من هذا السؤال . الجواب المقبول يبدو أن هناك تطابق سؤالك جدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top