2017-12-07 43 views
0

"자체 포함"통신 객체를 다른 스레드에 할당하여 GUI 처리 지연으로부터 격리 된 상태로 유지하려고합니다.QT QTimer와 QSerial을 사용하는 QThread - parenting

cAppCore::cAppCore(QObject *parent) : QObject(parent) 
{ 
    .... 
    CommCore = new cCommCore; 
    (here I do signal-slot connections between CommCore and AppCore) 
    .... 
} 

을하고 CommCore 생성자에서 나는 다음을 수행하십시오 :

그래서,에 "AppCore"객체 생성에 나는 부모없이 하나 "CommCore"를 만들

cCommCore::cCommCore(QObject *parent) : QObject(parent) 
{ 
    CommThread = new QThread(this); 
    CommSerial = new QSerialPort(this); 
    CommTimer = new QTimer(this); 

    connect(CommSerial,&QSerialPort::readyRead,this,&cCommCore::ProcessRXByte); 
    connect(CommSerial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &cCommCore::HandleSerialError); 
    connect(CommTimer, &QTimer::timeout, this,&cCommCore::TimerTimeout); 

    CommTimer->start(OFFLINE_POLL_TIME); 
    this->moveToThread(CommThread); 
    CommThread->start(QThread::HighPriority); 
} 
이제

내 질문 :

1- 스레드 처리기 객체를 이동 된 객체의 하위 객체로 만들면 괜찮습니까? GUI 스레드 (생성자가 호출되는 곳)에서 생성 된 다음 자체적으로 처리되는 스레드로 이동합니다 (컨트롤을 필요로 할 경우 CommCore 개체 내부에서 처리하도록 고려해야 함)

2 타이머 생성자 (타이머 생성자의 동일한 스레드, GUI 스레드)에서 타이머를 시작하고 모든 것을 새 스레드로 이동 한 직후입니까?

3- 타이머를 나중에 시작하고 싶다면 신호 슬롯을 통해서만 가능합니까? 여기서 GUI 스레드에서 내보내지고 CommCore 슬롯에 연결된 신호 (CommCore 스레드에서 대기열에 넣어지고 실행 됨)

4- 내 CommCore 개체와 AppCore (GUI 스레드) 간의 모든 상호 작용이 신호 슬롯 (스레드 안전)을 통해 만들어지면 개념적으로 정확합니까?

5 풀링에 기반한 (타이머에 의한) 시리얼 통신 루틴은 GUI 처리 지연으로부터 보호 될 것인가? (직렬 및 타이머 객체에 의해 생성 된 이벤트의 생성 및 처리에 지연이 없습니다.)

감사합니다!

답변

2
this->moveToThread(CommThread); 

이 개체에 부모가없는 경우 성공합니다. 따라서 생성자의 서명을 변경해야합니다. 그 외에도 객체가 자식과 함께 움직이면 괜찮습니다 ...

타이머가 다른 스레드로 이동 될 때 타이머를 시작해서는 안됩니다. 당신은 운전까지 남은 질문

QMetaObject::invokeMethod(CommTimer, "start"); 

모든 해답은 예를 perfoms 올바른 스레드되도록 invokeMethod 사용해야합니다. 신호를 사용하고 invokeMethod를 사용하여 호출하는 한 그것은 스레드가 실행 가능 풀에서 페치하여 실행중인 것과 같습니다.

스레드가 안전하고 메인 스레드 중단에 영향을받지 않습니다.

+0

맞아요, 고맙습니다. 그래서 invokeMethod를 사용하면 "movetothread"뒤에 생성자 안에 타이머의 시작 메소드를 호출 할 수 있습니다! 이것은 대상 객체의 스레드에서 메서드 호출을 "대기"합니다 (신호 슬롯 상호 작용과 비슷 함)? 좋은! 감사합니다! –