crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Виснет диалог при отрисовке, а в GUI ли я потоке?
Гость_Гость_Fynjy_*_*
сообщение 15.2.2018, 12:50
Сообщение #1





Гости








    


Привет ВСем! Итак вопрос такой: Есть класс, в полях которого есть указатель на объект наследник от QDialog. Я создаю обьект основного класса, в конструкторе этого класса я создаю обьект в динамической памяти - указатель на наследника QDialog. Обьеект оснновного класса далее я перевожу из GUI потока в другой. Обьект в поле основного класса который я создал динамически в его конструкторе, остается в GUI потоке. Почему при вызове exec у наследника QDialog создается форма диалоога и все виснет?
Base.h
class Base
{
  public:
  Base();

  private:
  QDeriveDialog* m_DeriveDialog;

}
Base.cpp:
Base::Base
{
m_DeriveDialog = new QDeriveDialog();
}
...
в основной программе:
qDebug() << thread();      // запомним поток GUI
QThread thr = new QThread;
Base* base = new Base;
base->moveTothread(thr);
...
Base.cpp:
void process()
{
   qDebug() << m_DerivedDialog->thread;   // проверяю к какому потоку принадлежит объект
                                          // и он равен потоку GUI,
   if(m_DerivedDialog->exec() == QDialog::Rejected) // однако при вызове диал.окна, в нем
                                                    // все виснет, окно появляется только контуром,
                                                    // все остальное не прорисовывается и курсор в
                                                    // колесико превращается
      ret = false;
...
}


Обратите внимание что объект m_DerivedDialog продолжет принадлежать основному потоку GUI, но диалог на отрисовке зависает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.2.2018, 7:09
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


в основном потоке обработкой сообщений системы занимается объект, производный от класса QCoreApplication (вернее, даже от QGuiApplication). А в твоём потоке есть такой объект ?

глянь описание функции QCoreApplication::processEvents

и главный вопрос - а зачем ты вообще пытаешься использовать виджет не в основном потоке? Какая задача ?

Сообщение отредактировал Алексей1153 - 16.2.2018, 7:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 15:39