Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] задание параметра слоту 
V
    Опции темы
kuvshinka
Дата 10.3.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хочу по клику кнопки сделать выполнение слота (функции), передав туда парметр....
где именно задается значение сего параметра?
Делаю так:
в классе MyKlass:
Код

 public slots:           
        void my_func(int param);


определение слота:
Код

void MyKlass::my_func(int param)
{
 if (param==1) ....
else....
}

в конструкторе другого класса (или где-то еще):
Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(my_func(int))); // указывается только тип   параметра, а его значение где задать?

PM MAIL   Вверх
SABROG
Дата 10.3.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



В своих сигналах - не вопрос. Каких параметров можно ожидать от сигнала clicked() кнопки?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Artemon
Дата 10.3.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



emit valueChanged(value); /// value - параметр сигнала, valueChanged - имя сигнала



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



kuvshinka, мдя... Qt-ешная сигнал-слотовая модель, никак не входит в рамки С++, точнее, даже нарушает их(необходимостью кодогенерации и НЕ способностью работать с шаблонами).
к примеру, для boost.signal или boost.function, это делается с использованием связывателя, или лямбда. но из-за того, что Qt-ешная сигнал-стотовая модель создается дополнительной кодогенерацией, и не поддерживает шаблоны - этого не реализовать в с++.

Добавлено @ 21:23
Цитата(Artemon @  10.3.2010,  21:17 Найти цитируемый пост)
emit valueChanged(value); /// value - параметр сигнала, valueChanged - имя сигнала

ты предлагаешь создать промежуточный метод(слот), в котором испускать сигнал?

Это сообщение отредактировал(а) andrew_121 - 10.3.2010, 21:23


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Artemon
Дата 10.3.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



Цитата

ты предлагаешь создать промежуточный метод(слот), в котором испускать сигнал?


Да, а уже из этого слота вызывать сигнал с подходящей сигнатурой.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Artemon, ну да, все что остается...
но если бы не убогая сигнал-слотовая модель, то это выглядело бы так:
Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(std::bind(&MyKlass::my_func, need_value)));

или так:
Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT([](){my_func(need_value);}));


кстати второй вариант успешно работает в QtPy.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 10.3.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Чем отличается этот код

Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(std::bind(&MyKlass::my_func, need_value)));


от этого:

Код

MyKlass *kl=new MyKlass();
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(my_func()));
...
void MyClass::my_func()
{
    int param = 1;
    if (param == 1)
    ...
}


Или

Код

MyKlass *kl=new MyKlass();
kl->setParam(1);
connect(pushButton1,SIGNAL(clicked()), kl,SLOT(my_func()));
...
class MyKlass
{
public:
    void setParam(int param) {MyKlass::param = param;}
private:
    int param;
}
...
void MyKlass::my_func()
{
    if (param ==1)
    ...
}


Правильный ответ - он бессмысленный во всех вариантах. Сигнал clicked() не передает никаких параметров, а прописывать константный параметр равносильно использованию константы внутри метода или класса. Всякие boost::bind'ы и std::bind1st/bind2nd это всё синтаксический сахар, цель которого меньше писать и выглядеть красиво.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
Чем отличается этот код

тем, что слот может быть произвольный. и иметь произвольное кол-во аргументов и типов, а значит гибкий.
и не нужен промежуточный слот.

Добавлено через 2 минуты и 20 секунд
Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
Сигнал clicked() не передает никаких параметров

а я хочу вызвать слот с нужными мне параметрами!
и не говорите что в этом нет надобности!
конечно, можно подумать над иным подходом к задаче. но зачем, если использование связывателей и лямбда никак не противоречит С++ ?!

Добавлено через 14 минут и 42 секунды
UP
Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
а прописывать константный параметр равносильно использованию константы внутри метода или класса

естественно.
но я не говорю про константу. я имел ввиду переменную.

Цитата(SABROG @  10.3.2010,  22:13 Найти цитируемый пост)
Всякие boost::bind'ы и std::bind1st/bind2nd это всё синтаксический сахар, цель которого меньше писать и выглядеть красиво.

хорошо что не вы утверждаете стандарты.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 10.3.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



QMetaObject::invokeMethod()

Через этот метод можно симулировать посылку сигналов от любого объекта к любому объекту, вызывать любые слоты с нужными параметрами. И всё это может работать даже когда объекты в разных потоках.

Цитата(andrew_121 @  10.3.2010,  22:28 Найти цитируемый пост)
но зачем, если использование связывателей и лямбда никак не противоречит С++ ?! 

Это противоречит мета-объектной системе Qt, она больше чем простые callback'и, это накладывает ограничения.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



тривиальный пример:
Код

my_thread: public QThread {
public:
   int my_var...
...
   void run() {
      ...
   }
};

struct any {
   void print_result(int v) {
      std::cout << "result = " << v << std::endl;
   }
};

int main() {
...
   any any;
   my_thread thread;

   // вот я хочу отобразить значение my_thread::my_var по завершении. как?!
   QObject::connect(&thread, SIGNAL(finished()), &any, SLOT(print_result(int)));

   thread.start();
   return ...
}


а вот так:
Код

my_thread: public QThread {
public:
   int my_var...
...
   void run() {
      ...
   }
};

struct any {
   void print_result(int v) {
      std::cout << "result = " << v << std::endl;
   }
};

int main() {
...
   any any;
   my_thread thread;

   // если бы не moc, можно было бы так -
   QObject::connect(&thread, SIGNAL(finished()), &any, SLOT(std::bind(&any::print_result, &any, thread.my_var));

   thread.start();
   return ...
}


немного усложним задачу:
Код

my_thread: public QThread {
public:
   int my_var...
...
   void run() {
      ...
   }
};

struct any {
   void print_result(const char* v) {
      std::cout << "result = " << v << std::endl;
   }
};

int main() {
...
   any any;
   my_thread thread;

   // или вот так -
   QObject::connect(&thread, SIGNAL(finished()), &any, SLOT( // но приемник уже указывать нет надобности
         [&]() {
            if ( thread.my_var == 1 )
               any.print_result("one!");
            else if ( thread.my_var == 2 )
               any.print_result("two!");
         };
      )
   );

   thread.start();
   return ...
}



Добавлено @ 23:02
Цитата(SABROG @  10.3.2010,  22:52 Найти цитируемый пост)
QMetaObject::invokeMethod()

да, если бы я мог создать анонимный объект вместо слота, в котором мог бы связать то что мне нужно с тем что мне нужно, то вопроса бы не возникло. но так я не могу! именно из-за метаобъектной системы!

Цитата(SABROG @  10.3.2010,  22:52 Найти цитируемый пост)
Это противоречит мета-объектной системе Qt

интересно...мы пишем на Qt используя С++, или на С++ используя Qt ?! разницу ощущаете? smile 

Это сообщение отредактировал(а) andrew_121 - 10.3.2010, 23:19


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kuvshinka
Дата 10.3.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мда, действительно сигнал-слотовая модель получается какая-то, мягко говоря, несовершенная...
а такая вышеуказанная задачка возникла как один из возможных вариантов решения следующей проблемы:
мне надо каким-то образом по кликам разных кнопок (тут-то и задаются коннекты кнопок с различными слотами gl-класса) выводить различные фигуры на виджет-потомок от QGLWidget (все фигуры отображаются естественно в paintGL и только в нем)?  Как-то наверное надо передавать параметр в  метод paintGL, определяющий в зав-ти от нажатой кнопки что именно надо визуализировать, а что - нет (то есть выводить на экран только часть кода метода paintGL), но как это все осуществить, если принудительно я не вызываю метод paintGL (а вызывается он при визуализации (метод show()) gl-виджета через экземпляр этого класса)? 
Как можно решить данную проблему?

PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(kuvshinka @  10.3.2010,  23:10 Найти цитируемый пост)
мне надо каким-то образом по кликам разных кнопок (тут-то и задаются коннекты кнопок с различными слотами gl-класса) выводить различные фигуры на виджет-потомок от QGLWidget

для этого смотрите: http://doc.trolltech.com/4.6/qsignalmapper.html


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 10.3.2010, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  10.3.2010,  22:58 Найти цитируемый пост)
анонимный объект вместо слота,

В ECMAScript тоже анонимные объекты есть, но их нет в C++ и это не вина Qt и мета-объектной системы.

Код

thread.start();
thread.wait();
any.print_result(my_var);


Не нравится wait()? Ок, сделай структуру any классом и унаследуйся от QObject'a. Оверхед? Ок, сделай другой класс. Не красиво, слишком много классов? Ок, перенеси функцию print_result() в класс my_thread(), сделай её слотом и выводи своё значение. Не хочешь менять структуру any? Ладно, передай в другой поток ссылку на метод print_result(), это будет не потокобезопасно, зато ровно также как и bind() вместо слота. Вариантов море.

Цитата(andrew_121 @  10.3.2010,  22:58 Найти цитируемый пост)
интересно...мы пишем на Qt используя С++, или на С++ используя Qt ?! разницу ощущаете?

Ага, это Страуструп пишет на программистах. Идеального ничего нет и со многими вещами приходится считаться. Несмотря на то, что язык C++ по своей сути должен быть переносимым, он таковым является не полностью. Разная размерность типов для разных компиляторов, архитектур, разное соблюдение стандартов, разные byte orders, разные размеры указателей для классов с виртуальным наследованием, разное выравнивание, разная оптимизация. И как следствие всего этого собираемая/не собираемая, рабочая/не рабочая, быстрая/медленная программа.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
kuvshinka
Дата 10.3.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Dimcheg.rar 10,49 Kb
PM MAIL   Вверх
andrew_121
Дата 10.3.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  10.3.2010,  23:27 Найти цитируемый пост)
В ECMAScript тоже анонимные объекты есть, но их нет в C++

у меня есть, лямбда зовутся smile 
gcc-4.5.0
mingw32(на основе gcc-4.5.0)

Цитата(SABROG @  10.3.2010,  23:27 Найти цитируемый пост)
Не нравится wait()? Ок, сделай структуру any классом и унаследуйся от QObject'a. Оверхед? Ок, сделай другой класс. Не красиво, слишком много классов? Ок, перенеси функцию print_result() в класс my_thread(), сделай её слотом и выводи своё значение. Не хочешь менять структуру any? Ладно, передай в другой поток ссылку на метод print_result(), это будет не потокобезопасно, зато ровно также как и bind() вместо слота. Вариантов море.

это все понятно.
но зачем все так усложнять, если в стандарте с++0х есть и std::bind и лямбда ?!

Добавлено через 14 минут и 30 секунд
kuvshinka, слишком мало информации чтоб что-то внятное ответить.
проект смотрел.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  10.3.2010,  23:44 Найти цитируемый пост)
это все понятно.
но зачем все так усложнять, если в стандарте с++0х есть и std::bind и лямбда ?! 

Ага, вот только стандарт еще не вышел. А судя по тому, что из черновиков выкинули концепты (boost::concept), то не известно что будет с лямбдой. Либо синтаксис поменяют, либо тоже выкинут.

И обратите внимание на предупреждение gcc:

http://gcc.gnu.org/gcc-4.5/cxx0x_status.html
Цитата

GCC provides experimental support for the upcoming ISO C++ standard, C++0



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 11.3.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  00:11 Найти цитируемый пост)
Ага, вот только стандарт еще не вышел. А судя по тому, что из черновиков выкинули концепты (boost::concept), то не известно что будет с лямбдой. Либо синтаксис поменяют, либо тоже выкинут.

что-что, но лямбда не выкинут.


Цитата(SABROG @  11.3.2010,  00:11 Найти цитируемый пост)
И обратите внимание на предупреждение gcc:

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

кстати в gcc стандарт реализован больше чем в 2010  студии. и работа не остановится. каждую неделю новый снэпшот.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kuvshinka
Дата 11.3.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



andrew_121: чем Вам "мало информации чтоб что-то внятное ответить"? там даже в проекте подписано (и не закомментированно, чтобы сразу было видно) что хотелось бы сделать - в конструкторе класса MainWindow написать соот-ие слоты, при которых по щелчку кнопки1 вызывалась бы первая часть метода paintGL, по Кнопке2 - вторая его часть...
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  11.3.2010,  00:15 Найти цитируемый пост)
что-что, но лямбда не выкинут.

Думаю многие также говорили про классы QHttp, поддержке Direct3d, или классе QMatrix в Qt. Я также думал, что в новом Delphi останутся те же методы в классе TTrayIcon, а они поменялись и моя программа перестала собираться. Думал, что Qt смогу всегда через MSYS собирать, но тролли и это зарубили. Думал, что скрытие (hide) закладок QTabWidget'a быстро добавят, хрен.

Цитата(andrew_121 @  11.3.2010,  00:15 Найти цитируемый пост)
что бы там не писали по этому поводу, но обратной дороги нет. и стандарт реализовывать все равно придется.

Стандарт, но не черновики.

Цитата(andrew_121 @  11.3.2010,  00:15 Найти цитируемый пост)
кстати в gcc стандарт реализован больше чем в 2010  студии. и работа не остановится. каждую неделю новый снэпшот.

Для меня это равносильно фразе "приложения Qt, где используются фичи нового стандарта могут не собираться на других платформах и компиляторах".


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



kuvshinka, где Q_OBJECT макрос?! Я негодую! smile 

Вы с этим чудом из одной группы что-ли? smile Задания похожие. И "фирменный" стиль.

Цитата(kuvshinka @  11.3.2010,  00:10 Найти цитируемый пост)
мда, действительно сигнал-слотовая модель получается какая-то, мягко говоря, несовершенная...

Да... Дожили... Вы HelloWorld-то не напишете. "Модель несовершенная". Мат. Много мата.

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

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Dimcheg.zip 3,76 Kb


--------------------
PM MAIL WWW GTalk Jabber   Вверх
andrew_121
Дата 11.3.2010, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  00:34 Найти цитируемый пост)
Для меня это равносильно фразе "приложения Qt, где используются фичи нового стандарта могут не собираться на других платформах и компиляторах". 

ну вам то это не впервой. тролли постоянно что-то меняю и удаляют.

но спор то не об этом. а о том, что метаобъектная модель нарушает/препятствует использования все мощи с++, а это ничто иное как шаблоны(на мой взгляд).
допустим, не будет в стандарте std::bind, и лямбда. но использовать шаблоны все равно нельзя!
страшно представить проект на Qt(в качестве ГУЯ) и библиотеки классов для кроссплатформенного программирования(типа boost). это же придется писать огромное кол-во переходников и адаптеров!

в общем, я совсем не против Qt, я против moc.

Добавлено @ 00:50
радует тот факт, что хоть PyQt и PySide хоть и являются всего лишь обертками, но в них не присутствуют следы moc`a

Это сообщение отредактировал(а) andrew_121 - 11.3.2010, 00:55


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



SABROGandrew_121, Вам не кажется, что Вы увлеклись?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
andrew_121
Дата 11.3.2010, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



так же, абсолютно не вижу надобности/плюсос метаобъектной системы. в бусте это все реализованно. и очень переносимо. и очень удобно. и очень потокобкзопастно. и не нарушая/не противореча остальным возможностям с++ !

Добавлено через 58 секунд
kemiisto, да, и правда.
сорри smile 
накипело smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(kemiisto @ 11.3.2010,  00:51)
SABROGandrew_121, Вам не кажется, что Вы увлеклись?

Согласен. Можешь лишнее удалить? От наших недопониманий стандарт быстрей не выйдет, а тролли вряд ли найдут способ как сделать полнофункциональную мета-объектную систему с теми возможностями языка, которые представляет C++.

Цитата

накипело


Читай вот, почему не boost: http://doc.trolltech.com/4.6/templates.html

Это сообщение отредактировал(а) SABROG - 11.3.2010, 01:07


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
kemiisto
Дата 11.3.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



Цитата(SABROG @  11.3.2010,  01:59 Найти цитируемый пост)
Можешь лишнее удалить?

Нет конечно. В этом разделе я обычный участник.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
andrew_121
Дата 11.3.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  00:59 Найти цитируемый пост)
Да не умеет твой буст с очередью сообщений работать.

не правда.
очередь сообщений: http://www.boost.org/doc/libs/1_42_0/doc/h....html#id1697099
в бусте это реализовано намного правильней.
так же, бустовские сигналы, умеют возвращать значения. а в Qt с этим полный аут. только посредством свойств классов.
думаю, если вы без маньякального патриотизма прочтете про boost.signals и про boost.function, вы найдете больше плюсов, чем минусов.

Цитата(SABROG @  11.3.2010,  00:59 Найти цитируемый пост)
И последние мои измерения скорости сигналов и слотов были не в пользу буста.

совсем чуть-чуть.

Добавлено через 1 минуту и 52 секунды
Цитата(SABROG @  11.3.2010,  00:59 Найти цитируемый пост)
Читай вот, почему не boost: http://doc.trolltech.com/4.6/templates.html

спасибо!
думаю за пять лет, ничего не изменилось.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  11.3.2010,  01:12 Найти цитируемый пост)
так же, бустовские сигналы, умеют возвращать значения. а в Qt с этим полный аут. только посредством свойств классов.


Слоты могут возвращать значения, если вызваны напрямую. У буста своя система событий, которая никак не переплетается с Qt'шной, от чего собственно у него и проблемы с потокобезопасностью:

FAQ к версии 1.42.0
Цитата

Q: Is Boost.Signals thread-safe?
    
A: No. Using Boost.Signals in a multithreaded concept is very dangerous, and it is very likely that the results will be less than satisfying. Boost.Signals will support thread safety in the future.


Это все говорит о том, что идет обычный callback.

Цитата(andrew_121 @  11.3.2010,  01:12 Найти цитируемый пост)
думаю, если вы без маньякального патриотизма прочтете про boost.signals и про boost.function, вы найдете больше плюсов, чем минусов.

Необходимость ставить boost, чтобы собрать Qt'шное приложение уже большой минус. Пока в нем острой необходимости не наблюдалось за 3-4 года работы с Qt.

Это сообщение отредактировал(а) SABROG - 11.3.2010, 01:22


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 11.3.2010, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  01:20 Найти цитируемый пост)
от чего собственно у него и проблемы с потокобезопасностью:

для этого есть Boost.Signals2


Цитата(SABROG @  11.3.2010,  01:20 Найти цитируемый пост)
Необходимость ставить boost, чтобы собрать Qt'шное приложение уже большой минус. Пока в нем острой необходимости не наблюдалось за 3-4 года работы с Qt.

ведать задачи разные.
я не представляю как и что можно писать не используя буст.


Цитата(SABROG @  11.3.2010,  01:20 Найти цитируемый пост)
Слоты могут возвращать значения, если вызваны напрямую.

а сигнал может вернуть значение возвращаемое слотом? а это очень удобно.


зы
пофлудим. все равно почистят тему.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  11.3.2010,  01:30 Найти цитируемый пост)
для этого есть Boost.Signals2


А ты видел как они реализованы? Через мутексы! Там очередь даже не используется. Это означает, что пока слот в одном потоке обрабатывает сигнал, управление в поток не вернется до его обработки. Потому и результат сигнала можно получить. В Qt же сигнал отправился и поток пошел работать дальше и не важно как долго будет выполняться слот в другом потоке, работают "одновременно" оба, особенно это видно на двухядернике.

Цитата(andrew_121 @  11.3.2010,  01:30 Найти цитируемый пост)
я не представляю как и что можно писать не используя буст.

Я когда-то писал на ассемблере и делал всё тоже самое, что могу сделать сейчас хоть на перле хоть на питоне. Благо Сишные библиотеки я уже тогда юзал из асма. Также как и WINAPI и COM с ActiveX.

Цитата(andrew_121 @  11.3.2010,  01:30 Найти цитируемый пост)
а сигнал может вернуть значение возвращаемое слотом? а это очень удобно.

Может. Это соединение называется Qt::BlockingQueuedConnectio


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 11.3.2010, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  01:38 Найти цитируемый пост)
Это означает, что пока слот в одном потоке обрабатывает сигнал, управление в поток не вернется до его обработки. Потому и результат сигнала можно получить. В Qt же сигнал отправился и поток пошел работать дальше и не важно как долго будет выполняться слот в другом потоке, работают "одновременно" оба, особенно это видно на двухядернике.

да, это минус.

Цитата(SABROG @  11.3.2010,  01:38 Найти цитируемый пост)
Может. Это соединение называется Qt::BlockingQueuedConnectio 

этот тип соединения я знаю. вот только не уверен что сигнал вернет значение, возвращаемое слотом. нужно экспериментировать.

Добавлено через 8 минут и 51 секунду
Цитата(SABROG @  11.3.2010,  01:38 Найти цитируемый пост)
Это означает, что пока слот в одном потоке обрабатывает сигнал, управление в поток не вернется до его обработки

вот подумал....и не вспомнил ситуации, когда этот факт мне реально мешал.
я конечно понимаю, что асинхронные сигналы это удобно. но не всегда! так же как и синхронные.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 11.3.2010, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



SABROG, я тут набросал пример, и не понимаю, как я могу получить значение возвращаемое слотом, при испускании сигнала?
я даже не представляю как это описать синтаксически. сигналы/слоты в Qt ведь не объекты.
в моем представлении, сигнал и слот, должны быть объектами. тогда все понятно. но в данном случае, нет.
Код

#include <iostream>

#include <QtCore/QObject>
#include <QtCore/QTimer>

/***************************************************************************/

class sender: public QObject {
    Q_OBJECT
public:
    sender(const int time = 1000, QObject* parent = NULL):QObject(parent) {
        QTimer::singleShot(time, this, SIGNAL(my_signal()));
    }

signals:
    int my_signal();
};

/***************************************************************************/

class receiver: public QObject {
    Q_OBJECT
public:
    receiver(QObject* parent = NULL):QObject(parent) {}

public slots:
    int my_slot() {
        std::cout << "called" << std::endl;
        return 33;
    }
};

/***************************************************************************/

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    sender sender;
    receiver receiver;

    QObject::connect(&sender, SIGNAL(my_signal()), &receiver, SLOT(my_slot()));

    return app.exec();
}

/***************************************************************************/


Это сообщение отредактировал(а) andrew_121 - 11.3.2010, 03:59


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  11.3.2010,  02:02 Найти цитируемый пост)
этот тип соединения я знаю. вот только не уверен что сигнал вернет значение, возвращаемое слотом. нужно экспериментировать.

В этом случае сигналы даже не нужны, достаточно простого вызова слота:

Код

int retVal;
QMetaObject::invokeMetod(objectInOtherThread, "someslot()", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, retVal), Q_ARG(QString, "test"));
if (retVal == X)

Вообще использование сигналов и слотов в Qt не обязательное условие о чем тролли и пишут. Можно тот же паттерн Observer сделать. Просто нужно позаботится о мутексах или атомарных операциях, чтобы сделать его потокобезопасным.

Цитата(andrew_121 @  11.3.2010,  02:02 Найти цитируемый пост)
вот подумал....и не вспомнил ситуации, когда этот факт мне реально мешал.

С тем же успехом можно вообще отдельный поток не создавать. Реальная ситуация, главный поток принимает соединения от клиентов, второй поток выполняет тяжелую работу над запросом. В случае с boost::signals2 пока отдельный поток выполняет тяжелую работу основной поток не знает подключился ли кто-то еще или нет, а из-за долгого молчания сервера на клиентской стороне начинает тикать таймаут в 60 секунд. Если твой второй поток за это время не уложится, то клиент отключится даже не узнав по какой причине его не пустили на сервер.

Цитата(andrew_121 @  11.3.2010,  02:02 Найти цитируемый пост)

я конечно понимаю, что асинхронные сигналы это удобно. но не всегда! так же как и синхронные.

К счастью в Qt есть выбор.

Цитата(andrew_121 @  11.3.2010,  03:56 Найти цитируемый пост)
SABROG, я тут набросал пример, и не понимаю, как я могу получить значение возвращаемое слотом, при испускании сигнала?

Передавай в качестве параметра сигнала указатель типа QWeakPointer и меняй значение. Сигнал испускай сам, а не через QTimer. Можно даже так сделать:

Код

emit someSignal(retVal);
qApp->processEvents();
if (retVal->value == X)



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 11.3.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  09:58 Найти цитируемый пост)
еальная ситуация, главный поток принимает соединения от клиентов, второй поток выполняет тяжелую работу над запросом

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


Цитата(SABROG @  11.3.2010,  09:58 Найти цитируемый пост)
int retVal;
QMetaObject::invokeMetod(objectInOtherThread, "someslot()", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, retVal), Q_ARG(QString, "test"));
if (retVal == X)

вы часто видели в пользовательском коде такое? я нет)


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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  11.3.2010,  10:46 Найти цитируемый пост)
вы часто видели в пользовательском коде такое? я нет)

Не видел. Потому, что мало кто зацикливается на том, что слот или сигнал должен вернуть значение. Как я уже говорил не сигналами со слотами едиными жив C++.

Цитата(andrew_121 @  11.3.2010,  10:46 Найти цитируемый пост)
для работы с сетью и вводом-выводом(в том числе и файловым(мультиплексированым и асинхронным)) использую asio, потому такой проблемы не возникало.
а вообще, если понять архитектуру asio и принцип организации, то становится ясно, почему при работе с ней, не возникает подобных проблем. а ведь в ней все основано функциональных объектах.

В asio только один плюс - Completion Port. В остальном он использует те же API и неблокирующие сокеты как и Qt. Я предложил уже троллям "допилить" модуль QtNetwork, чтобы эвенты сокетов получать через Completion Port. Пока ни ответа ни привета.



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 11.3.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(SABROG @  11.3.2010,  12:01 Найти цитируемый пост)
В asio только один плюс - Completion Port

это, если я не ошибаюсь, толь вендовая модель?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 11.3.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(andrew_121 @  11.3.2010,  12:05 Найти цитируемый пост)
это, если я не ошибаюсь, толь вендовая модель? 

Да, под *nix'ы это уже другой вопрос. Но я им инфу и для *nix'ов бросил.


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

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

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


 




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


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

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