2010-09-07 2 views
0

У меня есть QThread, который читает из сокета и посылает сигнал (сигнал QT), когда есть какие-либо данные. Это было бы легко с блокировкой чтения (2), но мне нужно иметь возможность остановить поток извне, не дожидаясь слишком долгого времени.Как прервать выбор/pselect, запущенный в QThread

Если бы я использовал pthread, я бы использовал pselect и pthread_kill(thread_id, some_signal), но у QThread нет , похоже, есть похожие методы. И добавление зависимости от pthread к этому проекту не кажется элегантным.

Я также не хочу использовать другие уродливые методы, такие как постоянная попытка чтения из сокета с некоторым относительно небольшим таймаутом.

Редактировать: Сокеты - это не TCP, а Bluetooth L2CAP.

ответ

1

Не слишком элегантное, но простое и рабочее решение: Создайте трубку и позвольте выбрать, подождите ли трубку или мой сокет. Таким образом я могу остановить ожидание в любое время, написав что-то в трубе.

0

Вы можете отправить сигнал в слот terminate() вашего QThread. Это остановит ваш поток в соответствии с политиками планирования ОС.

1

Вместо того чтобы иметь дело с самой резьбой, вы можете использовать асинхронный интерфейс QTcpSocket. Проверьте Fortune Client example.

+0

Это похоже на то, что мне нужно, но мои сокеты не являются TCP (это разъемы bluetooth L2CAP). Есть ли что-то подобное? Я ничего не могу найти, но это не значит, что нет :-) – cube

+1

Я не использовал его, но этот класс из модуля bluetooth выглядит правильно: http://doc.qt.nokia.com/ qtextended4.4/qbluetoothl2capsocket.html – Scott

Смежные вопросы