Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: StatuS74 от Сентября 23, 2011, 14:12



Название: сигнал и гуи
Отправлено: StatuS74 от Сентября 23, 2011, 14:12
Проблема в следующем...
есть коннект
Код:
test * test_1 = new test;

 connect (test_1,SIGNAL(signal_sn(QString)),this,SLOT(end_test(QString)),Qt::QueuedConnection);
проверял возвращает true.
но когда программа доходит до эмита то не происходит действия описанные в слоте end_test(QString)
Код:
void MainWindow::end_test(QString sn)
{
    if (sn.toInt()==serial1_1.toInt())
        {
        t->terminate();
        t->wait();
         ui->labSendLamp->setPixmap(QPixmap(QString::fromUtf8(":/circle_yellow.png")));

        }
    if (sn.toInt()==serial2.toInt())
        {
        t2->terminate();
        t2->wait();
         ui->labSendLamp_2->setPixmap(QPixmap(QString::fromUtf8(":/circle_yellow.png")));
        }
........

не могу решить проблемы с этим


Название: Re: сигнал и гуи
Отправлено: LisandreL от Сентября 23, 2011, 14:34
В слот не заходит или заходит но в sn что-то левое?


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 23, 2011, 14:35
он в слот вообще не заходит


Название: Re: сигнал и гуи
Отправлено: blood_shadow от Сентября 23, 2011, 15:08
он в слот вообще не заходит
давай больше кода, особенно интересно то место где у тебя живут потоки,
кстати, так t->terminate(); потоки лучше не завершать, это потенциально опасная операция,
лучше определи ф-цию типа stop() в которой и останавливай свой поток


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 05:59
поток гуляет тут

Код:
 void test::run()
    {     bool fl=false;
          int grad =0;
          bool t3 = false;

             connect(this, SIGNAL(signal_win(QString)),SLOT(mysignal_win(QString)));
                   connect(this, SIGNAL(signal_fail1(QString)),SLOT(mysignal_fail1(QString)));
                   connect(this, SIGNAL(signal_fail2(QString)),SLOT(mysignal_fail2(QString)));


          fl=test::tempiratura_datchika(tna_,file_name_,nms_,ftHandle1_,serial_);
           if (fl == true)
           {  grad = test::Start_test(tk_,file_name_,nms_,ftHandle1_,serial_,time_okonch_);
              if (grad>=tk_-0.5)
              {
                 t3 = test::time_test_2(time_okonch_,file_name_,ftHandle1_,serial_,t3);
                if (t3==true)
                 {
{
                      emit signal_sn(serial_);<=== испускаю сигнал который не работает
                      emit signal_win(serial_);<==== этот сигнал работает
...............


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 06:51
"лучше определи ф-цию типа stop() в которой и останавливай свой поток"


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


Название: Re: сигнал и гуи
Отправлено: LisandreL от Сентября 26, 2011, 07:32
Что происходит в mysignal_win?


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 07:47
выводится сообщение и все


Код:
void test::mysignal_win( QString serial_ms)
                  {


                      QMessageBox::warning(0,"ГОТОВО",
                                             "Тестирование завершено для датчика с серийным номером  "
                                                                                +serial_ms,
                                                                                 QMessageBox::Ok,QMessageBox::Ok);



                  }



Название: Re: сигнал и гуи
Отправлено: LisandreL от Сентября 26, 2011, 10:16
QMessageBox::warning? Из потока?
То есть на всё, что раньше мы вам писали вы забили. :-\
Ну удачи с проектом.


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 10:21
а что не так ?  я просто не понимаю программа не валится при отправки сообщения через слот. вы говорили что в потоке сообщения не  алё.. я исправил вот на это забулькало. до этого падала программа когда делал вывод сообщения не посредственно в run.


Название: Re: сигнал и гуи
Отправлено: kuzulis от Сентября 26, 2011, 10:58
...
я исправил вот на это забулькало.
...
У меня одного фраза "забулькало" вызвала нехорошие ассоциации? :)


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 11:08
...
я исправил вот на это забулькало.
...
У меня одного фраза "забулькало" вызвала нехорошие ассоциации? :)

это в смысле заработало =)


Название: Re: сигнал и гуи
Отправлено: blood_shadow от Сентября 26, 2011, 11:24
У меня одного фраза "забулькало" вызвала нехорошие ассоциации? :)
у меня тоже, короче выходные удались  ;D


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 12:46
кто нибуть знает из за чего такая проблема может быть ?*


Название: Re: сигнал и гуи
Отправлено: shirushizo от Сентября 26, 2011, 13:03
QMessageBox в гуи-поток убрать. Например, в главное окно, из которого потоки запускаются MainWindow::mysignal_win(QString).

Ну и закомментить emit signal_sn(serial_); и посмотреть будет ли работать MainWindow::end_test().


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 13:31
попробывал не работает. теперь и сигнал не фурычит в главный поток из потока. хотя коннект опять возвращает тру


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 13:51
а самое не понятное я из потока прокидываю сигнал на слот  кнопки на виджите работает. а прокидываю на  слот который я описал не работает... магия какаято


Название: Re: сигнал и гуи
Отправлено: andrew.k от Сентября 26, 2011, 14:22
попробуй замени QString на const QString &


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 14:31
заменил не помагло....


Название: Re: сигнал и гуи
Отправлено: StatuS74 от Сентября 26, 2011, 14:49
а ещё странная вещь...
вот метод ран
Код:
void test::run()
    {     bool fl=false;
          int grad =0;
          bool t3 = false;
          fl=test::tempiratura_datchika(tna_,file_name_,nms_,ftHandle1_,serial_);
           if (fl == true)
           {  grad = test::Start_test(tk_,file_name_,nms_,ftHandle1_,serial_,time_okonch_);
              if (grad>=tk_-0.5)
              {
                 t3 = test::time_test_2(time_okonch_,file_name_,ftHandle1_,serial_,t3);
                   if (t3==true)
                    {
                       emit win(serial_);
                     }
                       else
                         {
                          emit fail2(serial_);
                         }
              }
               else
                 {
                  emit fail1(serial_);
                 }
           }
            else
              {
               emit fail1(serial_);
              }

      }

когда прога доходит до emit win(serial_); она следующим шагом перепрыгивает emit fail1(serial_); при условии что создан только 1 поток и она ну ни как не может быть переведена туда.

коннекты выглядят теперь так

Код:
 bool a;



  a =  connect (this,SIGNAL(signal_sn(const QString &)),this,SLOT(end_test(const QString &)));
  a = connect (this,SIGNAL(signal_error(const QString &)),this,SLOT(error_test(const QString &)));
  a = connect(te, SIGNAL(win(const QString &)),this,SLOT(mysignal_win(const QString &)));
  a = connect(te, SIGNAL(fail1(const QString &)),this,SLOT(mysignal_fail1(const QString &)));
  a = connect(te, SIGNAL(fail2(const QString &)),this,SLOT(mysignal_fail2(const QString &)));