| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > обрушивается многопоточная программа |
| Автор: hexzo 12.10.2011, 09:50 | ||||
| Обрушивается многопоточная программа. Схема приблизительно такая. класс гуя { Sender* sender; //класс умеющий принимать сетевые сообщения конструктор_формы { receiveTcpMessageThread.putSender(sender); // я треду передаю экземпляр класса, метод которого он должен вызвать. } обработчик_кнопки { receiveTcpMessageThread.start(); //стартую тред } } класс receiveTcpMessageThread { run() { receiverref->startTcpListening(); } } И в результате происходит какая то хрень Предсмертное сообщение программы: QSocketNotifier: socket notifiers cannot be disabled from another thread Обваливается всё на строчке? которая содержится в классе Sender:
В шарпе эта схема замечательно работала, со скидкой на то, что там треду можно было сразу передать метод класса, и всё, что начинается с этого метода - будет работать в отдельном потоке, а здесь так нельзя. Добавлено через 4 минуты и 38 секунд Есть ещё такой извращённый вариант на крайний случай - завести в классе треда экземпляр Sender-а. Но тогда встаёт вопрос, как в треде не связанном с гуишным сделать
Потому как ошибка: "Widgets must be created in the GUI thread." |
| Автор: hexzo 12.10.2011, 10:29 | ||
hexzo
Есть такой извращённый вариант, перенести этот код в слот объекта привязанного к главному треду и соответственно вызывать его через сигнал. |
| Автор: hexzo 12.10.2011, 11:04 | ||
| А ещё можно вызывать в треде нужный метод сигналом. Так почему-то работает. По идее start_tcp_listening() должно срабатывать в треде гуишного потока, потому что receiverref привязан к нему, поскольку он в нём создавался. Но интерфейс почему-то не тормозится. А почему, я уже запутался.
|
| Автор: hexzo 12.10.2011, 12:36 | ||
Оно там и выполняется. А интерфейс не тормозился потому что у меня там выполнялось всё быстро. |