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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread и QStringList  (Прочитано 6250 раз)
debiannuser
Гость
« : Декабрь 18, 2013, 15:06 »

Добрый день, такая проблемка, запускаю несколько одинаковых потоков, которые в конструкторе получают указатель на QStrinigList и в перегруженной функции void run() читают этот QStringList, выводя в qDebug() результат, сначала все идет нормально, потом программа вылеает, помогите понять, пожалуйста, почему?

class Check : public QThread {
    QStringList* proxyList;
    QMutex mutex;
public:
    Check(QStringList* p) : proxyList(p) {}

    void run() {
        while (proxyList->size() > 0) {
            QString proxy = "";
            mutex.lock();
            if (proxyList->size() > 0)
                proxy = proxyList->front();
            mutex.unlock();

            QString host = proxy.split(":").at(0);
            int     port = proxy.split(":").at(1).toInt();

            qDebug() << "Addr: " << host << " : " << port;
            mutex.lock();
            QTest::qSleep(1000);
            mutex.unlock();

            mutex.lock();
            proxyList->pop_front();
            mutex.unlock();
        }
    }
};

Самое непонятное, если я убираю "QTest::qSleep(1000);", то все работает, и выводятся все строчки из QStringList

Создаю список с потокам и запускаю их так:
QStringList   plist = VK::loadData("proxy.txt");
    QList<Check*> tlist;

    if (QFile::exists("proxy.txt")) {
        for (int i = 0; i < 5; ++i) {
            tlist.push_back(new Check(&plist));
        }

        for (QList<Check*>::Iterator it = tlist.begin(); it != tlist.end(); ++it) {
            (*it)->start();
            QTest::qSleep(100);
        }
    } else qDebug() << "[-] No proxy file";
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Декабрь 18, 2013, 15:12 »

у тебя в каждом потоке свой mutex. Как не сложно догадаться, толку от этого никакого. Используй один глобальный mutex или объяви его статическим. И не используй мьютексы на каждый чих, это довольно дорогая операция.
« Последнее редактирование: Декабрь 18, 2013, 15:16 от Alex Custov » Записан
debiannuser
Гость
« Ответ #2 : Декабрь 18, 2013, 15:18 »

Спасибо за совет, про mutex'ы учту, а глобальным делал его, эффект к сожалению тот же
« Последнее редактирование: Декабрь 18, 2013, 15:26 от debiannuser » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Декабрь 18, 2013, 15:36 »

Спасибо за совет, про mutex'ы учту, а глобальным делал его, эффект к сожалению тот же
Посмотрите на QtConcurrent. Это избавит вас от низкоуровневых вещей и поможет сосредоточиться на задаче.
Записан
debiannuser
Гость
« Ответ #4 : Декабрь 18, 2013, 15:45 »

Все, понял в чем дело, тот QStringList, что передавался потокам в качестве аргумента конструктора был локальным! То есть как цикл завершался, переменная удалялась, вот и вылетало, как то так)) Но всеравно спасибо, особенно за QtConcurrent
Записан
VPS
Гость
« Ответ #5 : Декабрь 18, 2013, 16:00 »

Могу ошибаться, но на мой взгляд, в Вашем коде всё равно могут быть проблемы (не считая локального мьютекса), например вот тут:
Код:
mutex.lock();
proxyList->pop_front();
mutex.unlock();
Также, несколько потоков могут обрабатывать копию одной и той же строки (хотя может так и задумано).
Записан
jewawaiblegen
Гость
« Ответ #6 : Декабрь 18, 2013, 21:02 »

<center><a href=http://edmedrx.com/><img>http://shoprxmed.com/dorimg/cialis_fr.jpg</img></a></center>
 
CLICK HERE  http://edmedrx.com/
(copy and paste the link into your browser if link is not clickable)
 
 
 
 
cialis pastillas para la ereccion propecia gratis propecia efectividad medicamento comprar propecia levitra uso recreativo viagra no hace efecto 
 
viagra barato madrid
conseguir viagra barcelona
propecia en espana receta medica
tomar cialis es bueno
costo cialis 2 5 mg
comprar cialis plata
propecia contradicciones
uso de la viagra
cialis afecta el higado
viagra espana contrareembolso
viagra entregado rapido
propecia educacion
cialis 20 mg contraindicaciones
que es la viagra wikipedia
importar priligy
priligy riesgos
para que sirve el viagra yahoo respuestas
compro viagra en valencia
como conseguir viagra en madrid
priligy y epilepsia
 
 
comprar cialis almeria propiedades del propecia tomar viagra propecia ancianos mejor cialis o viagra cialis es con receta viagra venta libre cordoba levitra accion cialis comprar andorra comprobar con propecia 
 
cialis farmacia espana propecia tu retrato propecia espalnds bueno propecia acidos propecia o proscar viagra sin receta en sevilla jalea comprar kamagra priligy capsulas 
 
cialis fertilidad
cialis generico en el df
cialis generico en farmacias espanolas
comprar cialis andorra online
comprar levitra cialis
viagra fiable
viagra 25 mg dosis
viagra uso
viagra a los 17 anos
pastillas cialis 20 mg
cialis levitra yahoo
cialis precio oficial en farmacia
propecia espana finasteride 1mg
precio viagra autentica
resultados de propecia
kamagra sintomas
tomar viagra medicamentos
propecia produce esterilidad
servicio propecia
cialis efectos secundarios fotos
medicamento llamado cialis
cialis precio farmacia benavides
kamagra crema
viagra eyaculacion
viagra cialis levitra comparacion
levitra precio espana
viagra a los 40 anos
costo viagra 50 mg in farmacia
viagra y cerveza
costo viagra generico
 
 
cialis precio en espana comprar viagra sin receta en sevilla cialis en tenerife propecia diccionario generico viagra eu como se toma la viagra cialis de 20 mg pastilla cialis alcohol medicamentos cialis donde comprar cialis precio el cialis sirve para la mujer efectos secundarios cialis yahoo cialis 20 en madrid viagra se baja viagra a vendre
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 19, 2013, 11:07 »

Пользуйтесь тегом для оформления кода
        while (proxyList->size() > 0) {
            QString proxy = "";
            mutex.lock();
            if (proxyList->size() > 0)
                proxy = proxyList->front();
            mutex.unlock();
Пусть есть 2 рабочих нитки, а главная положила в proxyList эл-т. Тогда обе рабочих схватят этот эл-т (один и тот же) и будут его обрабатывать. Более того, они будут хватать его снова и снова - ведь то что эл-т обработан нигде не фиксируется.

Нужно добавить "синхронизацию", обычно используют QWaitCondition или QSemaphore (последний значительно проще)

Посмотрите на QtConcurrent. Это избавит вас от низкоуровневых вещей и поможет сосредоточиться на задаче.
Возможно и избавит, но понимания основ "многопоточного программирования" не добавит
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Декабрь 19, 2013, 11:23 »

Возможно и избавит, но понимания основ "многопоточного программирования" не добавит
А нужны они эти основы топикстартеру? Улыбающийся
Вот вы даже с С++ до конца разобраться не хотите/можете и ничего, не переживаете. Еще и других отговариваете. Улыбающийся
А основы эти со временем/пониманием освоятся... Ничего там сложного нет.
« Последнее редактирование: Декабрь 19, 2013, 11:27 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 19, 2013, 12:07 »

Вот вы даже с С++ до конца разобраться не хотите/можете и ничего, не переживаете. Еще и других отговариваете. Улыбающийся
Это кого ж я тут "оговорил"? Улыбающийся И вообще чего это Вас так распирает от желания покричать типа "смотрите, он этого не знает!!! А вот Я, Я знаю!!!" Улыбающийся Поверьте, пройдет не так уж много времени и то чем Вы сейчас гордитесь покажется Вам довольно мелким. C'est la vie

А может есть желание показать себя на деле? Так я могу подкинуть задачку на multi-thread, у меня их полно, Вы только скажите  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Декабрь 19, 2013, 13:17 »

Это кого ж я тут "оговорил"? Улыбающийся
оТговорил. Это важно.

И вообще чего это Вас так распирает от желания покричать типа "смотрите, он этого не знает!!! А вот Я, Я знаю!!!" Улыбающийся
Заметьте, я нигде не кричу о том, что знаю. А вы постоянно кричите о том, что вы не знаете и постоянно рекомендуете другим это не изучать. По моему, это плохо.

Поверьте, пройдет не так уж много времени и то чем Вы сейчас гордитесь покажется Вам довольно мелким. C'est la vie
Пройдет совсем немного времени и у вас не останется никаких актуальных знаний. Поверьте, это вас должно беспокоить больше. И как мне кажется уже беспокоит. Подмигивающий

А может есть желание показать себя на деле? Так я могу подкинуть задачку на multi-thread, у меня их полно, Вы только скажите  Улыбающийся
Ага, подкидывать вы горазды, но лучше вначале научиться их решать самому. Улыбающийся
А темы multi-thread мы с вами уже не раз обсуждали. Скучновато.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 19, 2013, 14:17 »

Пройдет совсем немного времени и у вас не останется никаких актуальных знаний. Поверьте, это вас должно беспокоить больше. И как мне кажется уже беспокоит. Подмигивающий
Отнюдь Улыбающийся Изучение "всего модного" приносит больше вреда чем пользы

Ага, подкидывать вы горазды, но лучше вначале научиться их решать самому. Улыбающийся
Ага, то есть каждую задачу "надо знать как решать". Проще говоря, найти и запомнить (заметим - часто найденное просто неверно). Но какой интерес в обсуждении запомненного? Выяснить кто же больше запомнил? Да конечно Вы, с удовольствием отдаю Вам эту печальную "пальму первенства".

Вообще если человек не создает тем - верный признак что дуст (или др "изучение") нашло свою жертву. Он уже все постиг, все умеет  Улыбающийся  Ну ладно, не надо так не надо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Декабрь 19, 2013, 14:26 »

Отнюдь Улыбающийся Изучение "всего модного" приносит больше вреда чем пользы
Глупости. Вспоминается 18 век, в котором "все что надо уже было придумано". Золотой век.
Правда, после паровых двигателей мы дошли до атомных станций... В общем один вред. Улыбающийся

Ага, то есть каждую задачу "надо знать как решать". Проще говоря, найти и запомнить (заметим - часто найденное просто неверно).
Из чего это следует? Улыбающийся
Более того, это бред. Если бы все решения уже были, нам бы нечего было делать.

Но какой интерес в обсуждении запомненного?
Не знаю. Это вы обсуждаете, вам виднее.

Вообще если человек не создает тем - верный признак что дуст (или др "изучение") нашло свою жертву. Он уже все постиг, все умеет  Улыбающийся  
Логику, я смотрю, вы тоже не изучали. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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