Russian Qt Forum
Ноябрь 05, 2024, 22:16
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
QThread и QStringList
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QThread и QStringList (Прочитано 6284 раз)
debiannuser
Гость
QThread и QStringList
«
:
Декабрь 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
Сообщений: 2063
Re: QThread и QStringList
«
Ответ #1 :
Декабрь 18, 2013, 15:12 »
у тебя в каждом потоке свой mutex. Как не сложно догадаться, толку от этого никакого. Используй один глобальный mutex или объяви его статическим. И не используй мьютексы на каждый чих, это довольно дорогая операция.
«
Последнее редактирование: Декабрь 18, 2013, 15:16 от Alex Custov
»
Записан
debiannuser
Гость
Re: QThread и QStringList
«
Ответ #2 :
Декабрь 18, 2013, 15:18 »
Спасибо за совет, про mutex'ы учту, а глобальным делал его, эффект к сожалению тот же
«
Последнее редактирование: Декабрь 18, 2013, 15:26 от debiannuser
»
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QThread и QStringList
«
Ответ #3 :
Декабрь 18, 2013, 15:36 »
Цитата: debiannuser от Декабрь 18, 2013, 15:18
Спасибо за совет, про mutex'ы учту, а глобальным делал его, эффект к сожалению тот же
Посмотрите на QtConcurrent. Это избавит вас от низкоуровневых вещей и поможет сосредоточиться на задаче.
Записан
debiannuser
Гость
Re: QThread и QStringList
«
Ответ #4 :
Декабрь 18, 2013, 15:45 »
Все, понял в чем дело, тот QStringList, что передавался потокам в качестве аргумента конструктора был локальным! То есть как цикл завершался, переменная удалялась, вот и вылетало, как то так)) Но всеравно спасибо, особенно за QtConcurrent
Записан
VPS
Гость
Re: QThread и QStringList
«
Ответ #5 :
Декабрь 18, 2013, 16:00 »
Могу ошибаться, но на мой взгляд, в Вашем коде всё равно могут быть проблемы (не считая локального мьютекса), например вот тут:
Код:
mutex.lock();
proxyList->pop_front();
mutex.unlock();
Также, несколько потоков могут обрабатывать копию одной и той же строки (хотя может так и задумано).
Записан
jewawaiblegen
Гость
cialis generica
«
Ответ #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
Сообщений: 11445
Re: QThread и QStringList
«
Ответ #7 :
Декабрь 19, 2013, 11:07 »
Пользуйтесь тегом для оформления кода
Цитата: debiannuser от Декабрь 18, 2013, 15:06
while (proxyList->size() > 0) {
QString proxy = "";
mutex.lock();
if (proxyList->size() > 0)
proxy = proxyList->front();
mutex.unlock();
Пусть есть 2 рабочих нитки, а главная положила в proxyList эл-т. Тогда обе рабочих схватят этот эл-т (один и тот же) и будут его обрабатывать. Более того, они будут хватать его снова и снова - ведь то что эл-т обработан нигде не фиксируется.
Нужно добавить "синхронизацию", обычно используют QWaitCondition или QSemaphore (последний значительно проще)
Цитата: Old от Декабрь 18, 2013, 15:36
Посмотрите на QtConcurrent. Это избавит вас от низкоуровневых вещей и поможет сосредоточиться на задаче.
Возможно и избавит, но понимания основ "многопоточного программирования" не добавит
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QThread и QStringList
«
Ответ #8 :
Декабрь 19, 2013, 11:23 »
Цитата: Igors от Декабрь 19, 2013, 11:07
Возможно и избавит, но понимания основ "многопоточного программирования" не добавит
А нужны они эти основы топикстартеру?
Вот вы даже с С++ до конца разобраться не хотите/можете и ничего, не переживаете. Еще и других отговариваете.
А основы эти со временем/пониманием освоятся... Ничего там сложного нет.
«
Последнее редактирование: Декабрь 19, 2013, 11:27 от Old
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QThread и QStringList
«
Ответ #9 :
Декабрь 19, 2013, 12:07 »
Цитата: Old от Декабрь 19, 2013, 11:23
Вот вы даже с С++ до конца разобраться не хотите/можете и ничего, не переживаете. Еще и других отговариваете.
Это кого ж я тут "оговорил"?
И вообще чего это Вас так распирает от желания покричать типа "смотрите, он этого не знает!!! А вот Я, Я знаю!!!"
Поверьте, пройдет не так уж много времени и то чем Вы сейчас гордитесь покажется Вам довольно мелким. C'est la vie
А может есть желание показать себя на деле? Так я могу подкинуть задачку на multi-thread, у меня их полно, Вы только скажите
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QThread и QStringList
«
Ответ #10 :
Декабрь 19, 2013, 13:17 »
Цитата: Igors от Декабрь 19, 2013, 12:07
Это кого ж я тут "оговорил"?
оТговорил. Это важно.
Цитата: Igors от Декабрь 19, 2013, 12:07
И вообще чего это Вас так распирает от желания покричать типа "смотрите, он этого не знает!!! А вот Я, Я знаю!!!"
Заметьте, я нигде не кричу о том, что знаю. А вы постоянно кричите о том, что вы не знаете и постоянно рекомендуете другим это не изучать. По моему, это плохо.
Цитата: Igors от Декабрь 19, 2013, 12:07
Поверьте, пройдет не так уж много времени и то чем Вы сейчас гордитесь покажется Вам довольно мелким. C'est la vie
Пройдет совсем немного времени и у вас не останется никаких актуальных знаний. Поверьте, это вас должно беспокоить больше. И как мне кажется уже беспокоит.
Цитата: Igors от Декабрь 19, 2013, 12:07
А может есть желание показать себя на деле? Так я могу подкинуть задачку на multi-thread, у меня их полно, Вы только скажите
Ага, подкидывать вы горазды, но лучше вначале научиться их решать самому.
А темы multi-thread мы с вами уже не раз обсуждали. Скучновато.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QThread и QStringList
«
Ответ #11 :
Декабрь 19, 2013, 14:17 »
Цитата: Old от Декабрь 19, 2013, 13:17
Пройдет совсем немного времени и у вас не останется никаких актуальных знаний. Поверьте, это вас должно беспокоить больше. И как мне кажется уже беспокоит.
Отнюдь
Изучение "всего модного" приносит больше вреда чем пользы
Цитата: Old от Декабрь 19, 2013, 13:17
Ага, подкидывать вы горазды, но лучше вначале научиться их решать самому.
Ага, то есть каждую задачу "надо знать как решать". Проще говоря, найти и запомнить (заметим - часто найденное просто неверно). Но какой интерес в обсуждении запомненного? Выяснить кто же больше запомнил? Да конечно Вы, с удовольствием отдаю Вам эту печальную "пальму первенства".
Вообще если человек не создает тем - верный признак что дуст (или др "изучение") нашло свою жертву. Он уже все постиг, все умеет
Ну ладно, не надо так не надо
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QThread и QStringList
«
Ответ #12 :
Декабрь 19, 2013, 14:26 »
Цитата: Igors от Декабрь 19, 2013, 14:17
Отнюдь
Изучение "всего модного" приносит больше вреда чем пользы
Глупости. Вспоминается 18 век, в котором "все что надо уже было придумано". Золотой век.
Правда, после паровых двигателей мы дошли до атомных станций... В общем один вред.
Цитата: Igors от Декабрь 19, 2013, 14:17
Ага, то есть каждую задачу "надо знать как решать". Проще говоря, найти и запомнить (заметим - часто найденное просто неверно).
Из чего это следует?
Более того, это бред. Если бы все решения уже были, нам бы нечего было делать.
Цитата: Igors от Декабрь 19, 2013, 14:17
Но какой интерес в обсуждении запомненного?
Не знаю. Это вы обсуждаете, вам виднее.
Цитата: Igors от Декабрь 19, 2013, 14:17
Вообще если человек не создает тем - верный признак что дуст (или др "изучение") нашло свою жертву. Он уже все постиг, все умеет
Логику, я смотрю, вы тоже не изучали.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...