2013-11-22 3 views
0

로컬 네트워크에서 ARP 검사를 수행하는 Qt 응용 프로그램을 설계하고 있습니다. 나는 (의사 코드) 여기 내 스레드 클래스를 가지고 : 나는 슬립 기능은 일정 시간에 대한 자신의 발신자 차단합니다 알고하나의 QThread 객체 내의 슬롯 기능을 동시에 실행할 수 있습니까?

class worker:public QThread 
{ 
    run() 
    { 
     .......some code; 

     .......some code; 
    } 

    slot function1() 
    { 
     .......some code; 
     sleep(5); 
     .......some code; 
    } 

    slot function2() 
    { 
     .......some code; 

     .......some code; 
    } 
} 

하지만, 윌 블록 다른 두 위의 기능 1에서 절전 기능뿐만 아니라 때문에 그들은 하나의 QThread 객체에 속해 있습니까? Function1과 function2는 연결된 신호에 의해서만 트리거 된 슬롯입니다.

감사합니다.

답변

1

질문에 대한 간단한 대답은 예입니다. 해당 상황에서 잠자기를 호출하면 스레드가 차단되어 스레드의 메시지 루프에있는 메시지가 처리되지 않습니다.

문제의 일부는 Qt가 스레드를 처리하는 방법에 대한 코드를 다시 작성하지 않으면 QThread를 상속 받아야한다는 사실에서 유래합니다.

class WorkerObject : public QObject 
{ 
    Q_OBJECT 

    public: 
     WorkerObject(QObject* parent = NULL); 

    private: 

    private slots: 
     void DoWork(); 
}; 


QThread* thread = new QThread; 
WorkerObject* worker = new WorkerObject(parent); 

worker->moveToThread(thread); 
// Qt 5 connect syntax 
connect(thread, &QThread::started, worker, &WorkerObject::DoWork); 
connect(thread, &QThread::finished, thread, &QThread deleteLater); 

thread->start(); 

이 방법을 완료, 여러 작업자 개체를 만들 수 있습니다 새에 임의의 수의 이동 -이 : 당신이 무엇을해야 "You're doing it wrong!"

는 QObject를에서 파생 된 노동자의 객체를 생성하고 QThread에 그 이동입니다 스레드, 작업자 개체 당 새 스레드를 고집하는 대신. 사용 가능한 프로세서 코어 수보다 많은 스레드를 생성하는 경우 이러한 추가 스레드를 사용하면 도움이되지 않습니다.

how to use QThreads here에 대한 자세한 내용을 볼 수 있습니다.

마지막으로 스레드에서 절전 모드를 호출해야하는 경우 디자인이 잘못되었을 수 있습니다. 기다리고 싶다면 아마도 QMutex을 사용하는 것이 더 나은 선택이 될 것입니다.

+0

'worker-> moveToThread (thread);'어딘가 필요하지 않니? 그렇지 않으면'WorkerObject :: DoWork'에 대한'QThread :: started' 신호 연결이'worker '가 여전히 연관되어있는 메인 스레드로 마샬링 된 상태로 되돌아 가지 않을까요? 아니면 Qt 5가 내가 모르는 것을 바 꾸었습니까? –

+0

@MichaelBurr, 죄송합니다! 물론, 내 실수. 오류를 지적 해 주셔서 감사합니다. O) – TheDarkKnight

+0

스레드 내부에서 신호가 실행 중이기 때문에 서브 클래스 QThread 접근 방식을 사용하고 있습니다. 내 작업자 개체는 스레드 내부에도 생성됩니다. – QtFan

0

응답 유형은 연결 유형에 따라 다릅니다. 같은 thread가 소유하고있는 2 개의 객체간에 접속이 되어도, 병행은되지 않습니다. 서로 다른 스레드에서 작성된 두 오브젝트간에 연결이 이루어지면 동시에 발생할 수 있습니다.

+0

감사합니다. 나는 당신의 의견에 따라 코드를 수정했다. – QtFan

관련 문제