Я работаю над многопоточным проектом QT. Основная проблема заключается в последовательном контроллере класса. Этот класс использует QMutex и QWaitCondition для синхронизации методов записи и чтения.
Проблема в том, что в дочернем классе заблокирован сигнал из-за метода ожидания qwaitcondition в родительском классе. Как только метод ожидания возвращается, сигнал в дочернем классе испускается (получатель также является дочерним классом).
Я думаю, что этот метод (qwaitcondition - wait) блокирует любое излучение сигнала во всем моем приложении.
Проблема в следующем:
constructor()
{
anotherclass = new MyClass;
}
void run()
{
forever
{
if(readmethod())
waitcondition.wakeall();
}
}
void method1()
{
sendpacket();
mutex.lock();
if(waitcondition.wait(&mutex,10000))
//somecode;
mutex.unlock();
}
class MyClass
{
someObject sobj;
MyClass()
{
connect(sobj,SIGNAL(somesignal),this,SLOT(someslot));
}
void someslot()
{
//some code
}
}
Мой слот, называемый только someslot, вызывается, когда условие qwait возвращается из-за тайм-аута (в данном случае 10 секунд).
Я просто хочу использовать mutex и условие qwait в этом классе, а не во всем приложении. Я пытался создать экземпляр класса детей в главном потоке, но у меня такое же поведение.
КОНЦЕПТУАЛЬНОЕ ИСПЫТАНИЕ
Я сделал тестовый проект и опубликовал его по этой ссылке:
testwaitconditionproject
тестовый проект работает следующим образом:
Условие ожидания связано с тайм-аутом, равным 10 секундам в родительском потоке.
Дочерний поток генерирует сигнал каждые 2 секунды, внутренний слот должен излучать сигнал, захваченный родителем. Как только родительский слот вызывается, флаг устанавливается в значение true. Этот флаг должен запустить wakeall, чтобы закончить условие ожидания.
НО НЕТ, только внутренние детские сигналы срабатывают после истечения времени ожидания. ЭТО МОЯ ОСНОВНАЯ ПРОБЛЕМА, родительское условие ожидания блокирует сигналы моих детей.
EDIT:
Я решил проблему в тестовом проекте, вызвав метод с условием ожидания в другом потоке. Я не могу повторить проблему, потому что асинхронный вызов метода происходит в потоке 1 (через dbus). Мне интересно, что вызов dbus отправляется в потоке 1, поэтому мои события в дочернем классе не будут отправляться, пока экземпляр принадлежит тому же потоку.
РЕДАКТИРОВАТЬ 2:
Я решил мою проблему, поместив pparent и детей в промежуточный класс qthread. они были созданы в методе run, также был использован вызов exec.