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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как запустить в Qt новый процесс (или поток) в виде функции?  (Прочитано 22455 раз)
a_n_y_a
Гость
« : Июль 28, 2009, 08:32 »

 Каким образом запустить процесс в виде функции. Или может быть это поток? Есть диалог, при нажатии на кнопку запускается процесс в котором выполняется заданная функция. Диалог ждет окончания работы этого процесса и завершает прогрмму. Как это сделать в Qt?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июль 28, 2009, 08:37 »

тебе надо унаследоваться от класса QThread и переопределить метод run(). В теории можно добавить член - указатель на функцию и сеттер ее и из своего run() вызывать. Вопрос в том, получится ли передавать методы других классов... когда я разбирался с указателями на методы классов, синтаксис был страшненький (особенно вызова)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Июль 28, 2009, 09:18 »

См. QtConcurrent::run и QtConcurrent Run Function Example
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #3 : Июль 28, 2009, 15:02 »

или QThreadPool и QRunnable
Записан
a_n_y_a
Гость
« Ответ #4 : Август 06, 2009, 09:51 »

тебе надо унаследоваться от класса QThread и переопределить метод run(). В теории можно добавить член - указатель на функцию и сеттер ее и из своего run() вызывать. Вопрос в том, получится ли передавать методы других классов... когда я разбирался с указателями на методы классов, синтаксис был страшненький (особенно вызова)

Спасибо, сделал, но есть проблемы:
Есть поток QThread, в него передается указатель на диалог,
Potok::Potok(QWidget *parent)
    : QWidget(parent)
{
...
   Pt=new PotokThread(this);
...
}

и в потоке запускается цикл:
   for(i=100;i>0;i--)
   {
      msleep(100);
//      Здесь Parent - укзатель на диалог,
//      ui.Zapolnenie - указатель на прогресбар в диалоге.
      Parent->ui.Zapolnenie->setValue(i);
   };
Прогрессбар заполняется нормально, но появляются сообщения на
каждое обращение к прогрессбару:

X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 184
  Extension:    155 (RENDER)
  Minor opcode: 25 (RenderCompositeGlyphs32)
  Resource id:  0x0

Что я сделал не правильно.
Записан
BRE
Гость
« Ответ #5 : Август 06, 2009, 10:13 »

Миллион раз уже обсуждали... Грустный
Нельзя работать с GUI из другого потока.
Записан
a_n_y_a
Гость
« Ответ #6 : Август 06, 2009, 12:13 »

Миллион раз уже обсуждали... Грустный
Нельзя работать с GUI из другого потока.

Но в виндах (в VC++) все работает нормально. Может как нибудь можно?
Записан
BRE
Гость
« Ответ #7 : Август 06, 2009, 12:23 »

Миллион раз уже обсуждали... Грустный
Нельзя работать с GUI из другого потока.

Но в виндах (в VC++) все работает нормально. Может как нибудь можно?
Нигде нельзя.  Подмигивающий
Поищи по форуму, есть много тем где это обсуждалось.
Из дочерней нити ты можешь послать сигнал или событие в главную (GUI) нить и в контексте главной нити работать с GUI объектами как захочешь.
Записан
a_n_y_a
Гость
« Ответ #8 : Август 07, 2009, 08:56 »

Миллион раз уже обсуждали... Грустный
Нельзя работать с GUI из другого потока.

Но в виндах (в VC++) все работает нормально. Может как нибудь можно?
Нигде нельзя.  Подмигивающий
Поищи по форуму, есть много тем где это обсуждалось.
Из дочерней нити ты можешь послать сигнал или событие в главную (GUI) нить и в контексте главной нити работать с GUI объектами как захочешь.

Спасибо все нашел. Вот только что то у меня возникли неожиданные проблемы.
Что то у меня не транслируется, что я делаю не правильно?
Есть класс:
class PotokThread : public QThread
{
   Q_OBJECT

public:
   PotokThread(){};
   virtual void run ();
   int I;
signals:
   void valueChanged(int i);
};

Говорит:
debug/potok.o: In function `PotokThread':
/usr/Potok/Potok/PotokThread.h:20: undefined reference to `vtable for PotokThread'

В  potok.с
   Pt=new PotokThread;

 В чем дело?

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Август 07, 2009, 09:12 »

виртуальная функция не реализована (просто переопределения недостаточно, нужно тело). Кстати PotokThread переводится как НитьНить%)
Записан
a_n_y_a
Гость
« Ответ #10 : Август 07, 2009, 12:09 »

Ура, все заработало! Огромное спасибо за помощь.
Записан
a_n_y_a
Гость
« Ответ #11 : Август 07, 2009, 14:02 »

Все заработало, но есть вопрос. Что такое emit? Что то я не найду про это ничего.
Есть только в примере Qt, а отдельно нигде нет. Просветите, пожалуйста.
Записан
uriel
Гость
« Ответ #12 : Август 07, 2009, 14:38 »

А вообще присоединяюсь к вопросу. Улыбающийся
Всегда интересовало, на кой чёрт он нужен, если препроцессором он всё равно разворачивается в пустую строку, а код прекрасно работет и без него.
Записан
BRE
Гость
« Ответ #13 : Август 07, 2009, 14:49 »

А вообще присоединяюсь к вопросу. Улыбающийся
Всегда интересовало, на кой чёрт он нужен, если препроцессором он всё равно разворачивается в пустую строку, а код прекрасно работет и без него.
Все уже обсуждали:
http://www.prog.org.ru/topic_8567_0.html
 Подмигивающий
Записан
uriel
Гость
« Ответ #14 : Август 07, 2009, 16:18 »

Все уже обсуждали:
http://www.prog.org.ru/topic_8567_0.html
 Подмигивающий
Аха, благодарю. Видимо, тогда я эту тему так и не дочитал до конца. Улыбающийся
Выходит, что из основных применений у него только одно - наглядность.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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