Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обрушивается многопоточная программа 
:(
    Опции темы
hexzo
Дата 12.10.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Обрушивается многопоточная программа. Схема приблизительно такая.

класс гуя {
  Sender* sender; //класс умеющий принимать сетевые сообщения
  конструктор_формы {
    receiveTcpMessageThread.putSender(sender); // я треду передаю экземпляр класса, метод которого он должен вызвать.
  }
  обработчик_кнопки {
   receiveTcpMessageThread.start(); //стартую тред
  }
}

класс receiveTcpMessageThread {
  run() {
   receiverref->startTcpListening();
  }
}

И в результате происходит какая то хрень
Предсмертное сообщение программы: QSocketNotifier: socket notifiers cannot be disabled from another thread
Обваливается всё на строчке? которая содержится в классе Sender:
Код

QTcpSocket *socket = tcpserver->nextPendingConnection();


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

Добавлено через 4 минуты и 38 секунд
Есть ещё такой извращённый вариант на крайний случай - завести в классе треда экземпляр Sender-а. Но тогда встаёт вопрос, как в треде не связанном с гуишным сделать
Код

   QLabel* label = new QLabel(result);
    label->setAttribute(Qt::WA_DeleteOnClose);
    label->setWordWrap(1);
    label->setStyleSheet("font: bold 14px;");
    label->show();

Потому как ошибка:
"Widgets must be created in the GUI thread."
PM MAIL   Вверх
hexzo
Дата 12.10.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



hexzo 
Цитата
Но тогда встаёт вопрос, как в треде не связанном с гуишным сделать

Есть такой извращённый вариант, перенести этот код в слот объекта привязанного к главному треду и соответственно вызывать его через сигнал.

Это сообщение отредактировал(а) hexzo - 12.10.2011, 10:30
PM MAIL   Вверх
hexzo
Дата 12.10.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



А ещё можно вызывать в треде нужный метод сигналом. smile
Так почему-то работает. По идее start_tcp_listening() должно срабатывать в треде гуишного потока, потому что receiverref привязан к нему, поскольку он в нём создавался. Но интерфейс почему-то не тормозится. А почему, я уже запутался.  smile 

Код

void TcpServerThread::run()
{
  connect(this,SIGNAL(run_this()),receiverref,SLOT(start_tcp_listening()));
  emit run_this();
  connect(receiverref,SIGNAL(send_received_message(QString)), owner,SLOT(make_notify_message(QString)));
}


Это сообщение отредактировал(а) hexzo - 12.10.2011, 11:07
PM MAIL   Вверх
hexzo
Дата 12.10.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата

По идее start_tcp_listening() должно срабатывать в треде гуишного потока, потому что receiverref привязан к нему

Оно там и выполняется. А интерфейс не тормозился потому что у меня там выполнялось всё быстро. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0400 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.