비슷한 질문이 많이 있지만 적합한 대답을 찾지 못했습니다.Qt : 신호 메인 스레드
타사 라이브러리를 사용합니다.
lib 클래스의 가상 메소드 중 일부가 호출되면 응용 프로그램에서이 아닌 이 아닌 작업자 스레드에서 호출됩니다. 이 스레드는 QThread가 아니며 앞으로있을 수 없습니다.
Qt :: DirectConnection을 사용하여 슬롯을 연결 한 경우에만이 스레드에서 방출 할 수 있습니다. 결과적으로 SLOT의 QObject :: sender()는 항상 NULL을 반환합니다. 예를 들어 deleteLater()를 호출하고 싶지만 QThread에서만 예약 할 수 있습니다.
메인 스레드로 되돌아 가야한다고 생각하지만 어떻게 메인 스레드에서 오브젝트에 신호를 보낼 수 있습니까?
예제 : 아래 메소드가 호출 될 때 타사 라이브러리에서 생성 된 스레드에서 수행됩니다. 명시 적 Qt::DirectConnection
없이
/*virtual*/ void
SipCall::state_answer_call::onEntering(SipCall& ref)
{
...
MediaPlayer* player = new MediaPlayer;
ref.connect(player, SIGNAL(sigFinished()), SLOT(slotMediaFinished()), Qt::DirectConnection);
...
}
이 SipCall::slotMediaFinished()
가 호출되지 않습니다 다음과 같이
/*virtual*/ bool MediaPlayer::onEof()
{
stopTransmit();
emit sigFinished(); // slots only called if bound using Qt::DirectConnection
deleteLater(); // dtor is never called
return false;
}
연결은 또한 비 QThread의 컨텍스트 내에서 이루어집니다.
안녕하세요, 작업자 스레드가 다른 API에서 나왔으므로이 API의 메소드를 사용해야합니다. 그러나 여하튼 당신은이 구현에서 신호를 낼 수있었습니다. 그것은 귀하의 응용 프로그램에서 스레드에 대한 포인터를 잡고, 스레드가 스레드의 신호를 보내고, Qt MainThread에 연결하고, 슬롯에서 삭제하는 솔루션일까요? (만약 당신이 이미 Mainthread에 있다면 deleteLater까지 기다릴 필요가 없습니다.) 또는 기다려야 할 경우 개체를 삭제하지 말고 플래그를 지정한 개체를 삭제하십시오. –
나는 내가 이해하고 있는지 잘 모르겠다. 'QThread'가 아니라면 QThread가 아닌 큐에있는 큐에 신호를 보내면됩니다. - QThread에서 타겟 코드 *가 실행되는 한. 어떻게 연결을 만들고 있습니까? 코드를 보여줄 수 있습니까? –
@ G.M. 연결은 일반적인 QObject :: connect() 변형입니다. 특별한 것은 없습니다. 하지만 당신의 의견은 아마 그 자체가 다른 라이브러리 스레드 내에서 발생한다고 생각하게 만들었습니다. 그래서 디버그를 추가하고 이것을 확인했습니다 : 연결은 다른 (Qt 아님) 작업자 스레드 내에서 이루어집니다. – iwarv