Зависание GUI при использовании QThread

384
24 января 2017, 23:08

Появилась проблема с зависанием gui. Пытался запустить в отдельном потоке: mainwindow.cpp

   sip *mysip = new sip;
    QThread *sip_thread = new QThread(this);
    mysip->moveToThread(sip_thread);
    sip_thread->start();
    mysip->resiveSipParameters(login,pass); //передаем логин и пароль в sip.cpp для запуска авторизации
    mysip->startSip();

sip.cpp

sip::sip(QObject *parent) : QObject(parent)
{
}
void sip::resiveSipParameters(QString login, QString pass)
{
    SipLogin = login;
    SipPass = pass;
    qDebug() << SipLogin;
    qDebug() << SipPass;
}
void sip::startSip()
{
    int ret = 0;
    Endpoint ep;
    try
    {
        ep.libCreate();
       // sipReady(ep);
        ret = PJ_SUCCESS;
    }
    catch (Error & err)
    {
//            std::cout << "Exception: " << err.info() << std::endl;
//            ret = 1;
    }

    // Init library
    EpConfig ep_cfg;
    ep_cfg.logConfig.level = 6;
    ep_cfg.logConfig.filename = "/home/alexey/crm/sip.log";
    ep.libInit(ep_cfg);

    // Transport
    TransportConfig tcfg;
    tcfg.port = 5060; //5080 mango
    ep.transportCreate(PJSIP_TRANSPORT_UDP, tcfg);
    // Start library
    ep.libStart();
    // std::cout << "*** PJSUA2 STARTED ***" << std::endl;

    // Add account
    AccountConfig acc_cfg;
    acc_cfg.idUri = ("sip:"+SipLogin+"@***.mangosip.ru").toStdString();
    acc_cfg.regConfig.registrarUri = "sip:***.mangosip.ru";
    acc_cfg.sipConfig.authCreds.push_back(AuthCredInfo("digest", "*", SipLogin.toStdString(), 0, SipPass.toStdString())); //подставляем полученный логин и пароль
//  std::auto_ptr<MyAccount> acc(new MyAccount);
//  acc->create(acc_cfg);
    qDebug() << SipLogin;
    qDebug() << SipPass;
    MyAccount *acc = new MyAccount;
    try
    {
        acc->create(acc_cfg);
    }
    catch(Error& err)
    {
        std::cout << "Account creation error: " << err.info() << std::endl;
    }

    // Just wait for ENTER key
    std::cout << "Press ENTER to quit..." << std::endl;
    std::cin.get();
}

В итоге все равно окно mainwindow зависает. Нужно ли еще делать connect для очереди?

Answer 1

Из документации на функцию moveToThread:

Changes the thread affinity for this object and its children. The object cannot be moved if it has a parent. Event processing will continue in the targetThread.

После выполнения функции обработка событий будет осуществляться в другом потоке. Вы же используете прямой вызов функций resiveSipParameters и startSip, тем самым функции выполняются в основном GUI-потоке.

Будет правильно использовать сигналы и слоты:

QObject::connect(sip_thread, &QThread::started, mysip, [&login, &pass, mysip]() {
  mysip->resiveSipParameters(login, pass);
  mysip->startSip();
});
READ ALSO
FLTK: загрузка и вывод изображения

FLTK: загрузка и вывод изображения

Пытаюсь загрузить изображение из файла, но ловится такая ошибка:

291
template неправильно работает [дубликат]

template неправильно работает [дубликат]

На данный вопрос уже ответили:

321
Преобразование char в const char*

Преобразование char в const char*

Эта функция принимает вектор типа char и возвращает числоВ каждой ячейке вектора хранится одна цифра

330
Исключение вещественных чисел в int

Исключение вещественных чисел в int

Всем доброго времени, появилась некоторая необходимость в языке, который я не знаю абсолютноСобственно, по заданию необходимо сделать ввод...

289