Frage

Ich habe einen Haupt-Thread, die ein Kind Thread-Funktion zu unterschiedlichen Zeiten rufen, aber ich bin nicht sicher, ob das richtig ist, wie es in Qt.What zu tun, ist falsch mit dem Code unten und auf der Suche nach besserer Alternative

Es gibt einen Haupt-Thread läuft infinitly wenn jemals Haupt-Thread die Sperre Kind hat ein Stück Arbeit.

#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();  
}
War es hilfreich?

Lösung

Edit:. Nacharbeit gesamten Beitrag Grundlagen zu decken als auch

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;
}

Beispiel für die Ausgabe:

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

Seien Sie sicher, dass Sie moc auf dem Header-Dateien ausführen, Qmake und < a href = "http://www.cmake.org/cmake/help/documentation.html" rel = "nofollow noreferrer"> Cmake beide unterstützen die Makefiles zu schaffen.

Hier ist die CMakeLists.txt Datei, die ich verwenden, um den Code zu erstellen:

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)

Andere Tipps

Eigentlich Ihre aktuelle Lösung für das Problem ist ein ganz netter Hack.

Wenn Sie es in einer „sauberen“ Art und Weise zu tun, es bevorzugen, sollten Sie eine Ereignisschleife in Ihrem Worker-Thread starten. Dann wird der Arbeiter-Thread der Lage sein, Signale von dem Haupt-Thread zu empfangen. Sie könnten eine Funktion in der untergeordneten Thread aufrufen aus dem Haupt-Thread (Signal / Slot-Mechanismus) Betrieb auszulösen.

Sehen Sie hier für weitere Informationen: http://doc.trolltech.com/4.2/threads. html # pro-thread-Ereignisschleife

(Hinweis: Die Schlüsselidee ist, dass Sie das Aufnahmeobjekt in dem Worker-Thread erstellen, dann wird ihre Schlitze in diesem Thread verarbeitet werden, oder könnten Sie verwenden MoveToThread () Funktion)

Es scheint, dass Sie ein Signal dafür verwenden mögen, mit dem normalen Qt-Stil zu passen. Schauen Sie sich diese Frage ; die akzeptierte Antwort scheint es zu Ihrer Frage zu passen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top