crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

gpepsi
  опции профиля:
сообщение 30.9.2011, 13:48
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Использовал сигнал из потока. Обработчик слота находился в другом потоке.
Заметил, что сигнал не доходит.

Поставил Qt::DirectConnection. Сигнал стал приходить.
Но читая про него обнаружил еще и Qt::BlockingQueuedConnection, про который было написано, что он предназначен для
работы из различных потоков и так же блокирует очередь. Но есть коментарий, что этот сигнал может привести
к deadlock-у.

В чем тогда различае между ними, если оба блокируют, но только второй может зависнуть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Гость_lanz_*
сообщение 14.8.2012, 14:12
Сообщение #2





Гости








    


Прошу прощения, криво отправилось.

MoPDoBoPoT все правильно говорит. Правильный код:
QObject::connect(&sender, SIGNAL(send()), &receiver, SLOT(receive()), Qt::QueuedConnection);

sender.start();
app.exec ();
sender.wait();

run работает в другом потоке, но объект источник сигнала создан в том же, поэтому DirectConnect работает. Принадлежность к треду свойство объекта, а не фрагмента кода. Не уверен что такое использование правильное, я бы делал:
class Sender : public Qbject {
    Q_OBJECT

public:
    void run (void)
    {
         while (true) {
            emit send ();
            QTest::qSleep (1000);
         }
    }

signals:
    void send(void);
};

class SenderThread : public QThread {
    Q_OBJECT
private:
    virtual void run (void)
    {
        Sender my_sender; // Объект создан в новом треде
        connect (...) // Коннектим сигнал сендера к объекту в главном потоке
                          // указатель на приемник можно получить по разному
        my_sender.run ();
    }
};

int main(int argc, char* argv[])
{
    QCoreApplication app(argc, argv);

    Receiver receiver;
    SenderThread sender_thread;


    sender_thread.start();
    app.exec ();

    return 0;
}

Правильно запускать в методе run цикл обработки событий.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 23.5.2025, 13:36