Qt Проблема обработки событий из-за QWaitCondition - PullRequest
0 голосов
/ 18 июня 2011

Я работаю над многопоточным проектом 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.

1 Ответ

0 голосов
/ 20 июня 2011

Кажется, что вы не запускаете цикл событий QCoreApplication, который необходим для обработки событий. Метод write () вызывается до того, как QCoreApplication :: exec () блокирует цикл обработки событий. Более того, кажется, что важно создать все объекты QThread внутри потока, который имеет цикл обработки событий (если вы хотите использовать сигналы от таких объектов). Я получил ваш пример, создал дополнительный поток, который запускает pparent (и разблокирует QCoreApplication :: exec ()), и он работает хорошо.

...