문제

다른 시간에 자식 스레드 기능을 호출하는 기본 스레드가 있지만 QT에서 올바른 방법인지 확실하지 않습니다. 아래 코드에 문제가 있고 더 나은 대안을 찾고 있습니다.

메인 스레드가 잠금 하위가 작업을 수행 할 때 무한히 실행되는 메인 스레드가 있습니다.

#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

헤더 파일에서 MOC를 실행해야합니다. 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.html#per-thread-event-loop

(힌트 : 핵심 아이디어는 작업자 스레드에서 수신 객체를 생성한다는 것입니다. 그러면 그 슬롯이 해당 스레드에서 처리되거나 movetothread () 함수를 사용할 수 있습니다).

일반 QT 스타일에 맞게 신호를 사용하고 싶을 것 같습니다. 체크 아웃 이 질문; 받아 들여진 답변도 귀하의 질문에 맞는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top