Russian Qt Forum

Qt => Общие вопросы => Тема начата: debiannuser от Декабрь 18, 2013, 15:06



Название: QThread и QStringList
Отправлено: 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";


Название: Re: QThread и QStringList
Отправлено: Alex Custov от Декабрь 18, 2013, 15:12
у тебя в каждом потоке свой mutex. Как не сложно догадаться, толку от этого никакого. Используй один глобальный mutex или объяви его статическим. И не используй мьютексы на каждый чих, это довольно дорогая операция.


Название: Re: QThread и QStringList
Отправлено: debiannuser от Декабрь 18, 2013, 15:18
Спасибо за совет, про mutex'ы учту, а глобальным делал его, эффект к сожалению тот же


Название: Re: QThread и QStringList
Отправлено: Old от Декабрь 18, 2013, 15:36
Спасибо за совет, про mutex'ы учту, а глобальным делал его, эффект к сожалению тот же
Посмотрите на QtConcurrent. Это избавит вас от низкоуровневых вещей и поможет сосредоточиться на задаче.


Название: Re: QThread и QStringList
Отправлено: debiannuser от Декабрь 18, 2013, 15:45
Все, понял в чем дело, тот QStringList, что передавался потокам в качестве аргумента конструктора был локальным! То есть как цикл завершался, переменная удалялась, вот и вылетало, как то так)) Но всеравно спасибо, особенно за QtConcurrent


Название: Re: QThread и QStringList
Отправлено: VPS от Декабрь 18, 2013, 16:00
Могу ошибаться, но на мой взгляд, в Вашем коде всё равно могут быть проблемы (не считая локального мьютекса), например вот тут:
Код:
mutex.lock();
proxyList->pop_front();
mutex.unlock();
Также, несколько потоков могут обрабатывать копию одной и той же строки (хотя может так и задумано).


Название: cialis generica
Отправлено: jewawaiblegen от Декабрь 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


Название: Re: QThread и QStringList
Отправлено: Igors от Декабрь 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. Это избавит вас от низкоуровневых вещей и поможет сосредоточиться на задаче.
Возможно и избавит, но понимания основ "многопоточного программирования" не добавит


Название: Re: QThread и QStringList
Отправлено: Old от Декабрь 19, 2013, 11:23
Возможно и избавит, но понимания основ "многопоточного программирования" не добавит
А нужны они эти основы топикстартеру? :)
Вот вы даже с С++ до конца разобраться не хотите/можете и ничего, не переживаете. Еще и других отговариваете. :)
А основы эти со временем/пониманием освоятся... Ничего там сложного нет.


Название: Re: QThread и QStringList
Отправлено: Igors от Декабрь 19, 2013, 12:07
Вот вы даже с С++ до конца разобраться не хотите/можете и ничего, не переживаете. Еще и других отговариваете. :)
Это кого ж я тут "оговорил"? :) И вообще чего это Вас так распирает от желания покричать типа "смотрите, он этого не знает!!! А вот Я, Я знаю!!!" :) Поверьте, пройдет не так уж много времени и то чем Вы сейчас гордитесь покажется Вам довольно мелким. C'est la vie

А может есть желание показать себя на деле? Так я могу подкинуть задачку на multi-thread, у меня их полно, Вы только скажите  :)


Название: Re: QThread и QStringList
Отправлено: Old от Декабрь 19, 2013, 13:17
Это кого ж я тут "оговорил"? :)
оТговорил. Это важно.

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

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

А может есть желание показать себя на деле? Так я могу подкинуть задачку на multi-thread, у меня их полно, Вы только скажите  :)
Ага, подкидывать вы горазды, но лучше вначале научиться их решать самому. :)
А темы multi-thread мы с вами уже не раз обсуждали. Скучновато.


Название: Re: QThread и QStringList
Отправлено: Igors от Декабрь 19, 2013, 14:17
Пройдет совсем немного времени и у вас не останется никаких актуальных знаний. Поверьте, это вас должно беспокоить больше. И как мне кажется уже беспокоит. ;)
Отнюдь :) Изучение "всего модного" приносит больше вреда чем пользы

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

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


Название: Re: QThread и QStringList
Отправлено: Old от Декабрь 19, 2013, 14:26
Отнюдь :) Изучение "всего модного" приносит больше вреда чем пользы
Глупости. Вспоминается 18 век, в котором "все что надо уже было придумано". Золотой век.
Правда, после паровых двигателей мы дошли до атомных станций... В общем один вред. :)

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

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

Вообще если человек не создает тем - верный признак что дуст (или др "изучение") нашло свою жертву. Он уже все постиг, все умеет  :)  
Логику, я смотрю, вы тоже не изучали. :)