crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AltA
  опции профиля:
сообщение 16.2.2015, 17:57
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 16.2.2015
Пользователь №: 4339

Спасибо сказали: 0 раз(а)




Репутация:   0  


Приветствую.
Возникает проблема при работе приложения. Debug пишет:
ASSERT: "!isEmpty()" in file /usr/include/qt4/QtCore/qlist.h, line 282

нагуглил: эта строка значит что я использую элемент qlist'а, в то врема, как qlist пуст.
код выгледит примерно так
void TestThread::run()
{
    ips.clear();
    ports.clear();

    for(;;)
    {
        ok = ports.isEmpty(); // или ips,isEmpty() или и то и другое, ошибка остаётся
        while (!ok && ok1)
        {
            // qDebug() << ips.isEmpty() << ports.isEmpty(); почемуто при пустых листах ports и ips всё равно false

            QTcpSocket* socket;
            socket = new QTcpSocket();
            socket->connectToHost(ips.dequeue(),ports.dequeue());

            if(socket->waitForConnected())
                emit isgood(ips.dequeue(),ports.dequeue());
            //else
               // qDebug()<<"bad"<<ips.first() << this;

            delete socket;
        }


    }


}


Масивы ips и ports пополняются в функции этого класса, в ней же устанавливается ok1 = true; ключевое слово volatile при обьявлении ok и ok1 эфекта не даёт, и судя по всему в моём коде просто некоректно работает функция isEmpty()

знаю что подход к потокам извращенский, пробывал QtConcurrent::run, QThreadPool, в слотах QThread писал проверку, результат - последующий сокет ждёт 30 сек чека предидущего, даже если они чекаются в разных потоках. так вроде работает в несколько потоков.

ps не пинайте по лицу, самоучка, недавно подружился с qt

спасибо




Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
wiz29
  опции профиля:
сообщение 16.2.2015, 18:48
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Судя по куску кода: нет потокобезопасного обращения к спискам из разных потоков. Советую сделать хотябы объект синхронизации доступа (QMutex или QReadWriteLock) к ips и ports.
В приведенном куске кода происходит изъятие элементов, где то происходит заполнение этих контейнеров, все это должно быть "обложено" доступом к данным через объект синхронизации.

Сообщение отредактировал wiz29 - 16.2.2015, 18:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 3.6.2025, 16:51