Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: потоки и сигналы (QT3.3.8)
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
karabura
Проблема не оригинальная, следующая (я здесь нашёл в FAQ такую тему - но мне не подошло, она здесь для QT4):
Имеется главный поток, в виде формочки, на которой должна отображаться быстро меняющаяся информация, и поток,
который собственно эту информацию и достаёт (в бесконечном цикле). Главная форма нужна, дабы управлять потоком.
А поток обновляет информацию на главной формочке. Я попробовал вот так:
http://www.forum.crossplatform.ru/index.ph...%E6%E5%ED%E8%E5
не получилось, понятно, что вряд ли от QT4 получится в QT3.
Дайте пожалуйста ссылку, как проще это сделать в QT3 (или пример по существу).
Litkevich Yuriy
Цитата(karabura @ 23.6.2009, 14:21) *
не получилось, понятно, что вряд ли от QT4 получится в QT3.
А что не получилось?
SABROG
karabura, а в Qt 3 нет сигналов и слотов или потоков или ты не знаешь как сделать emit сигнала в поток? Я вообще не понял в чем у тебя проблема.
karabura
объявление класса потока - в отдельном h файле,
class MThread:public QThread {
Q_OBJECT
....
....
virtual void run();
MThread ():QThread {...}
signals:
void sendWL(char *);
};


реализация в другом.

Теперь суть главной формы (пришлось залезть в файл .ui/frmMain.h):
в классе Form1

#include "../thread.h"
class Form1:public QMainWindow {
Q_OBJECT
MThread *mthread;
.....
.....
protected slots:
void setWL(char *);
...
...
};

void Form1::setWL(char *wl) {
...
}


В конструкторе главной формы:
Form1::Form1 (.......) {
...
...
mthread=new MThread();
connect(&mthread, SIGNAL( sendWL(char *) ), this, SLOT( setWL(char *) ))

}


компилятор выдаёт по русски:
.ui/frmMain.cpp: In constructor ‘Form1::Form1(QWidget*, const char*, uint)’:
.ui/frmMain.cpp:187: ошибка: нет подходящей функции для вызова ‘Form1::connect(MThread**, const char [16], Form1* const, const char [15])’
/usr/lib/qt/include/qobject.h:116: замечание: претенденты: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*)
/usr/lib/qt/include/qobject.h:226: замечание: bool QObject::connect(const QObject*, const char*, const char*) const
Kagami
Цитата
connect(&mthread, SIGNAL( sendWL(char *) ), this, SLOT( setWL(char *) ))

Зачем ты берешь адрес от указателя?
karabura
Цитата(Kagami @ 23.6.2009, 15:05) *
Цитата
connect(&mthread, SIGNAL( sendWL(char *) ), this, SLOT( setWL(char *) ))

Зачем ты берешь адрес от указателя?

Прошу прощения за опечатку, конечно же ссылки там быть не должно, но тем не менее характер ошибки не меняется
SABROG
Цитата
но тем не менее характер ошибки не меняется

Как он может не поменяться, когда ошибка явно указывает на двойной указатель?:

‘Form1::connect(MThread**


Когда вторым объектом в connect является this указатель - его можно опустить:

connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ))


Кстати твой слот отработает в основном цикле, а не в потоке. Спроси меня почему.
karabura
‘Form1::connect(MThread**


Цитата(SABROG @ 23.6.2009, 16:28) *
Кстати твой слот отработает в основном цикле, а не в потоке. Спроси меня почему.

Почему? Но слот то и должен отработать в основном цикле - он должен обновить инфу на лабеле.
Но это не компилится :(
SABROG
А нет, это я ошибся, у тебя сигнал из потока посылается, а не наоборот, тогда должно работать.

Цитата(karabura @ 23.6.2009, 13:31) *
Но это не компилится :(


Покажи ошибки. Подозрение у меня на тип char *
karabura
убрал ссылку из connect:
connect(mthread, SIGNAL( sendWL(char *), SLOT( setWL(char *) ) );

всё равно вот это выдаётся компилятором:
.ui/frmMain.cpp: In constructor ‘Form1::Form1(QWidget*, const char*, uint)’:
.ui/frmMain.cpp:187: ошибка: нет подходящей функции для вызова ‘Form1::connect(MThread*&, const char [16], const char [15])’
/usr/lib/qt/include/qobject.h:116: замечание: претенденты: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*)


Цитата(karabura @ 23.6.2009, 15:35) *
connect(mthread, SIGNAL( sendWL(char *), SLOT( setWL(char *) ) );
atic bool QObject::connect(const QObject*, const char*, const QObject*, const char*)

скобку в пост забыл, в исходниках она есть
SABROG
Покажи объявление mthread.

MThread*&


Ссылка на указатель. Это у тебя не так mthread объявлен?

MThread mthread;
karabura
Цитата(SABROG @ 23.6.2009, 15:38) *
Покажи объявление mthread.

MThread*&


Ссылка на указатель. Это у тебя не так mthread объявлен?

MThread mthread;

Объявлен в классе основной формы:
MThread *mthread;

А в конструкторе формы я его создаю, перед коннектом
mthread=new MThread();
...
connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ) );
...
SABROG
Выложи тут в архиве исходники.
karabura
Цитата(SABROG @ 23.6.2009, 16:01) *
Выложи тут в архиве исходники.

Там правда не всё, одного заголовочника нет - но это к сути отношения не имеет.
Прошу не издеваться над "сырым кодом" :) - я в QT впервые
SABROG
Цитата(karabura @ 23.6.2009, 14:09) *
Прошу не издеваться над "сырым кодом"


Если ты в Qt впервые, то зачем ты выбрал такую старую её версию? Издеваться никто не будет, а если будут, то тебе только на пользу, будешь знать как надо делать правильно ;)
karabura
Не получилось сразу загрузитьНажмите для просмотра прикрепленного файла

Цитата(SABROG @ 23.6.2009, 16:11) *
Если ты в Qt впервые, то зачем ты выбрал такую старую её версию?
А я и не выбирал, она у меня по дефолту стояла, разве она не работоспособная? Я не совсем просто понимаю, чем она в контексте простейшей задачи хуже QT4?
SABROG
Файл frmMain.h, видишь что там написано:

/****************************************************************************
** Form interface generated from reading ui file 'frmMain.ui'
**
** Created: Втр Р˜СЋРЅ 23 10:20:35 2009
**      by: The User Interface Compiler ($Id: qt/main.cpp   3.3.8   edited Jan 11 14:47 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
...
class Form1 : public QMainWindow
{
    Q_OBJECT
    
    MThread *mthread;
public:
    Form1( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel );
    ~Form1();


Если ты сделаешь make clean && make distclean && qmake && make, то твои изменения все потеряются. Тебе надо выносить класс в отдельный модуль. Косяк скорее всего в том, что какая-то часть была изменена, а при компиляции эти изменения не видны. Нужно перекомпилить все приложение.

А вообще лучше переходи на Qt 4.
karabura
Цитата(SABROG @ 23.6.2009, 16:31) *
Файл frmMain.h, видишь что там написано:

/****************************************************************************
** Form interface generated from reading ui file 'frmMain.ui'
**
** Created: Втр Р˜СЋРЅ 23 10:20:35 2009
**      by: The User Interface Compiler ($Id: qt/main.cpp   3.3.8   edited Jan 11 14:47 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
...
class Form1 : public QMainWindow
{
    Q_OBJECT
    
    MThread *mthread;
public:
    Form1( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel );
    ~Form1();


Если ты сделаешь make clean && make distclean && qmake && make, то твои изменения все потеряются. Тебе надо выносить класс в отдельный модуль. Косяк скорее всего в том, что какая-то часть была изменена, а при компиляции эти изменения не видны. Нужно перекомпилить все приложение.

А вообще лучше переходи на Qt 4.

Да, конечно я читал - и именно поэтому не делал qmake. Но я предполагал - что обычный make в этом случае отследит изменения (как это ему и положено).
Спасибо за ответ, я попробую вынести в отдельный модель, ясно - что переходить на 4 придётся в последствии.
Но я не смог в QT Creator - е его средствами создать свою функцию-слот (как в designer) - и это мне не очень понравилось. Хотя скорее всего нужно тщательно изучать матчасть :)
pastor
QThread в Qt3 не является наследником QObject, поэтому и возникает ошибка компиляции при

connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ) );


(ругается на первый параметр)

Для реализации сигналов слотов в QThread (Qt3) нужно прибегнуть к двойному наследованию

class MThread : public QThread, public QObject
{
    Q_OBJECT
....
};
SABROG
От оно чё михалыч! Значит я правильно говорю, надо на Qt 4 пересаживаться :rolleyes:
igor_bogomolov
Цитата(karabura @ 23.6.2009, 11:21) *
Дайте пожалуйста ссылку, как проще это сделать в QT3
В тройке для этих целей используются события: QCustomEvent и QCoreApplication::postEvent

почитать можно здесь:
http://www.prog.org.ru/index.php?topic=809...g43192#msg43192
http://www.prog.org.ru/index.php?topic=891...g50072#msg50072
Litkevich Yuriy
Цитата(karabura @ 23.6.2009, 17:14) *
Я не совсем просто понимаю, чем она в контексте простейшей задачи хуже QT4?

Они существенно отличаются.
В общем случае эти две версии несовместимы.
В 4-ке появилось много полезных возможностей.
Большенство людей работают в 4-ке, и могут полноценно подсказать только по ней.
3-ку проблемно скомпилировать под виндовоз, с бесплатными версиям напряг.
karabura
Цитата(pastor @ 23.6.2009, 17:11) *
QThread в Qt3 не является наследником QObject, поэтому и возникает ошибка компиляции при

connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ) );


(ругается на первый параметр)

Для реализации сигналов слотов в QThread (Qt3) нужно прибегнуть к двойному наследованию

class MThread : public QThread, public QObject
{
    Q_OBJECT
....
};

Очень ценно! Спасибо большое!
Вчера пересел за 4, всё заработало. Но всё равно под третьим запущу!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2022 IPS, Inc.