Russian Qt Forum
Ноябрь 02, 2024, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Изменение текущего индекса QStackedWidget из потока pthread  (Прочитано 11202 раз)
alexlogvinenkoit
Гость
« : Ноябрь 15, 2011, 11:53 »

Здравствуйте!

Такая вот проблема: есть класс, наследующийся от QStackedWidget, в нем много классов, наследующихся от QWidget...
Есть поток, который запускается из QStackedWidget (pthread).

Так вот, в этом потоке мне нужно менять текущий индекс QStackedWidget (QStackedWidget::setCurrentIndex(int index));
Прога на этом моменте вылетает, вот, что пишет:

Цитировать
<unknown>: Fatal IO error 11 (Ресурс временно недоступен) on X server :0.0.

Код:
class WidgetStacked : public QStackedWidget
{
    //...
    explicit WidgetStacked (QWidget * parent) : QStackedWidget(parent)
    {
        //...
        pthread_t th;
        pthread_create(&th, 0, ThreadCallback, (void *)this);
    }
    friend void * ThreadCallback(void * param);
};

void * ThreadCallback(void * param)
{
    //...
    ((WidgetStacked *)param)->setCurrentIndex(0);
}

При чем, если просто поменять текст лейбы или еще какие-то действия с дочерними виджетами - то работает...
Подскажите, пожалуйста, в чем может быть дело и как можно решить данную проблему.

Спасибо!
Записан
alexlogvinenkoit
Гость
« Ответ #1 : Ноябрь 15, 2011, 12:41 »

Есть идея, только не знаю как реализовать (и вообще возможно ли)...

Если программировать на C# - такая проблема всплывает очень часто.
Ее решают очень просто - создают делегат.

Есть ли в Qt (или даже лучше в C++) делегаты или хотя бы что-то отдоленно похожее?
Просто никогда не сталкивался с токого рода проблемой с C++
Записан
BRE
Гость
« Ответ #2 : Ноябрь 15, 2011, 12:58 »

Почитай про QThread и систему сигнал-слот (есть специальный режим для передачи сигналов между потоками).
Изменять GUI можно только из главного потока!
Записан
alexlogvinenkoit
Гость
« Ответ #3 : Ноябрь 15, 2011, 13:07 »

Повторюсь: из отдельного потока можно делать определенные действия с GUI (я менял текст лейбы (удачно)).
Вылетает только при вызове функции setCurrentIndex(int index).

P.S. Пробовал сделать public-функцию SetIndex(int index), в ней уже вызвать setCurrentIndex(index), а ьиз потока вызывать SetIndex(int index). Тоже не помогает.
Пробовал еще послать сигнал (emit) - тоже ничего Улыбающийся

Да и еще, поток не QThread, а pthread_t...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Ноябрь 15, 2011, 13:24 »

Повторюсь: из отдельного потока можно делать определенные действия с GUI (я менял текст лейбы (удачно)).
Вылетает только при вызове функции setCurrentIndex(int index).
Можешь повторяться сколько угодно, но
Изменять GUI можно только из главного потока!
Вся перерисовка в Qt делается асинхронно, поэтому при изменении текста ничего не упало.
Изменение stacking-order и не только его на X11 делается синхронно (со стороны Qt, вернее Xlib) поэтому и падает.

Цитировать
P.S. Пробовал сделать public-функцию SetIndex(int index), в ней уже вызвать setCurrentIndex(index), а ьиз потока вызывать SetIndex(int index). Тоже не помогает.
От перестановки слогаемых сумма не меняется...

Цитировать
Пробовал еще послать сигнал (emit) - тоже ничего
Кому и как слал?

Цитировать
Да и еще, поток не QThread, а pthread_t...
Тем более...
« Последнее редактирование: Ноябрь 15, 2011, 13:27 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
alexlogvinenkoit
Гость
« Ответ #5 : Ноябрь 15, 2011, 13:29 »

Спасибо, проблему понял.
Вот только решения не понял... Решение какое-нибудь найти можно?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Ноябрь 15, 2011, 13:34 »

Спасибо, проблему понял.
Вот только решения не понял... Решение какое-нибудь найти можно?
Всё зависит от того как быстро ты сможешь перейти от pthreads к QThread.
Записан

Qt 5.11/4.8.7 (X11/Win)
alexlogvinenkoit
Гость
« Ответ #7 : Ноябрь 15, 2011, 13:44 »

Дело в том, что изначально-то и был QThread, но это поток читает из COM-порта, а при использовании QThread - на моменте чтения прога вылетает. Уже даже не помню что писал, но точно какая-то ошибка была.

А если из потока pthread вызвать поток QThread? И в потоке QThread просто вызвать функцию setCurrentIndex(int index)?

Т.е. так же, как в дочерних виджетах вызываю ((QStackedWidget *)->parent())->setCurrentIndex(int index)?
Записан
BRE
Гость
« Ответ #8 : Ноябрь 15, 2011, 13:55 »

Для переключения нужно будет посылать сигнал через очередь сообщений, это можно сделать еще и с помощью invokeMethod.
Записан
thechicho
Гость
« Ответ #9 : Ноябрь 15, 2011, 14:58 »

//Вся перерисовка в Qt делается асинхронно, поэтому при изменении текста ничего не упало.
Изменение stacking-order и не только его на X11 делается синхронно (со стороны Qt, вернее Xlib) поэтому и падает.

а я то думал, почему у меня прога в убунту падает.
итс факин щит.
придется все переделывать. таскать указатель на гуишный элемент, сначала в поток, потом обратно в гуи, через сигналы и слоты. ну чо бл за маразм В замешательстве
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Ноябрь 15, 2011, 15:03 »

таскать указатель на гуишный элемент, сначала в поток, потом обратно в гуи, через сигналы и слоты. ну чо бл за маразм В замешательстве
Действительно маразм. А зачем так делать  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
alexlogvinenkoit
Гость
« Ответ #11 : Ноябрь 15, 2011, 15:22 »

Маразм, согласен!

Я бы посмотрел в сторону Java, но проект уже написан, остается пару вещей сделать.
И вот эта проблема - одна них.

Если кто знает, каким образом можно ренить проблему, отпишитесь, please, очень надо!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Ноябрь 15, 2011, 16:30 »

Если кто знает, каким образом можно ренить проблему, отпишитесь, please, очень надо!
Дык решение очевидно - не "таскать указатель на гуишный элемент, сначала в поток, потом обратно в гуи".
Записан

Qt 5.11/4.8.7 (X11/Win)
thechicho
Гость
« Ответ #13 : Ноябрь 15, 2011, 16:34 »

допустим запускается 100 потоков. как тогда сделать синхронизацию каждого потока с гуи? (QLineEdit, QLabel)
Записан
alexlogvinenkoit
Гость
« Ответ #14 : Ноябрь 15, 2011, 16:35 »

Цитировать
Дык решение очевидно - не "таскать указатель на гуишный элемент, сначала в поток, потом обратно в гуи".

Немного не понял... Покажите на примере, please...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.