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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигнал и цикл  (Прочитано 3743 раз)
Max Payne
Гость
« : Май 07, 2012, 02:52 »

Всем привет, извините за тривиальный вопрос, но никак не могу понять.
Есть цыкл в котором обрабатывается стринги, мне нужно каждую итерацию отправлять стринг через сигнал из цыкла, сделал все просто емит из цикла но приходит только один стринг и ничего больше. Я в чем то ошибся ? Спасибо за помощь.
Записан
Fat-Zer
Гость
« Ответ #1 : Май 07, 2012, 08:19 »

при обычном connect()'е цикл не продолжится, пока обработчик сигнала не завершится, если я правильно понял...
а вообще код в студию...
Записан
Bepec
Гость
« Ответ #2 : Май 07, 2012, 09:00 »

Код в студию. Зависит от того, какого типа connect вы используете. Если прямой - то цикл продолжится лишь после выполнения слота, если очередь, то будет вполне корректное поведение.
Записан
Max Payne
Гость
« Ответ #3 : Май 07, 2012, 11:07 »

Циклы где отсылается сигнал :
Код:
do
        {
            vlad newV;
            QSqlRecord rec = read.record();
            newV.ID_Owner=rec.field("ID_Owner").value().toInt();
            newV.Vlad = rec.field("Владелец").value().toString();
            newV.Address = rec.field("Адрес").value().toString();
            newV.Num_Phone = rec.field("Телефон").value().toString();
            newV.Club = rec.field("Клуб").value().toString();
            newV.email = rec.field("e-mail").value().toString();
            newV.pitom = rec.field("Питомник").value().toString();
            emit this->progDownString(newV.Vlad);
            crVlad.append(newV);
        }
        while (read.next());
        qw_4.finish();

        QSqlQuery write (dbSql);
        write.exec("create table Владелец (ID_Owner INTEGER PRIMARY KEY NOT NULL,"
                   "Владелец VARCHAR (64) NOT NULL,"
                   "Адресс VARCHAR (256),"
                   "Телефон VARCHAR (32),"
                   "Клуб VARCHAR (32) NOT NULL,"
                   "email VARCHAR (64),"
                   "Питомник VARCHAR (128),"
                   "constraint Vl_fk FOREIGN KEY (ID_Owner)references Animals (ID_Owner) on update cascade on delete cascade)");
        for (int i = 0 ; i < crVlad.size(); i++)
        {
            if(!write.prepare("insert into Владелец (ID_Owner,Владелец, Адресс, Телефон, Клуб, email, Питомник)"
                              " values (:qr,:wr,:er,:r,:t,:y,:u)"))
            {
                QMessageBox::critical(this,tr ("Ошибка 003"), tr (" Невозможно добавить запись в таблицу 'Владелец' .").append(dbSql.lastError().text()));
                break;
            }
            write.bindValue(":qr",crVlad.at(i).ID_Owner);
            write.bindValue(":wr",crVlad.at(i).Vlad);
            write.bindValue(":er",crVlad.at(i).Address);
            write.bindValue(":r",crVlad.at(i).Num_Phone);
            write.bindValue(":t",crVlad.at(i).Club);
            write.bindValue(":y",crVlad.at(i).email);
            write.bindValue(":u",crVlad.at(i).pitom);
            emit this->progDownString(crVlad.at(i).Vlad);
            write.exec();

        }
Вот сам обьект QProgressBar

Код:
bar = new Prog_bar(this);

    connect (this, SIGNAL(progDownString(QString)), bar, SLOT(set_down_label(QString)),Qt::DirectConnection);
    connect(this, SIGNAL(progUpString(QString)), bar, SLOT(set_upLabel(QString)),Qt::DirectConnection);
    connect (this, SIGNAL(progValPerCent(int)), bar, SLOT(set_prog_value(int)),Qt::DirectConnection);
Записан
Fat-Zer
Гость
« Ответ #4 : Май 07, 2012, 12:17 »

ошибка by-design: если это один поток, то весь интерфейс будет тормозить да и сама операция тоже...
если разные, то нужно использовать Qt::QueuedConnection.

то что проходит только один стринг определяете визуально? или в отладчике? или в выводе в qDebug()?
Записан
Max Payne
Гость
« Ответ #5 : Май 09, 2012, 07:49 »

Визуально только один =/ Да и поток один ...

 
Записан
stima
Гость
« Ответ #6 : Май 09, 2012, 16:27 »

Зачем вам общение в одном потоке через сигналы с DirectConnection? Вызывайте просто как метод класса. Это идентично в данном случае.

Если вы будете использовать QuededConnection, то все сигналы будут обработаны когда поток будет "свободен" в Вашем случае это после цикла.

И вопрос на засыпку. crVlad.size() больше 1?
Записан
Max Payne
Гость
« Ответ #7 : Май 09, 2012, 21:37 »

crVlad.size() больше одного, а конект я пишу потому что мне нужно передать этот стринг на другую юи-форму, которой управляет другой класс
Записан
stima
Гость
« Ответ #8 : Май 10, 2012, 10:30 »

Чтобы передать переменные в другой класс не обязательно использовать сигнало-слотовую взаимосвязь.
Привидите код слота куда уходит сигнал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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