Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
1

[Qt] QThread ошибка создания потока.

22.01.2015, 16:17. Показов 1604. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Не так давно пишу на c++, а в частности на Qt. На данный момент реализовываю проложение работающее с потоками.
И так суть: запускается n-ое количество потоков класса MyClass, в MyClass запускается QNetworkAccessManager с выполнением POST запроса. Вот реализация:
Запуск потоков:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QThread* gdkTheard = new QThread;
godanKeyRequest* gdk = new godanKeyRequest(proxy, mail, this->GODANKEY_KEY);
 
gdk->moveToThread(gdkTheard);
 
connect(gdkTheard, SIGNAL(started()), gdk, SLOT(process()));
 
connect(gdk, SIGNAL(sendComplete(QString, QString, int)), this, SLOT(keyRequested(QString, QString, int)));
 
connect(gdk, SIGNAL(finished()), gdkTheard, SLOT(quit()));
connect(gdk, SIGNAL(finished()), gdk, SLOT(deleteLater()));
connect(gdk, SIGNAL(destroyed()), gdkTheard, SLOT(quit()));
connect(gdkTheard, SIGNAL(finished()), gdkTheard, SLOT(deleteLater()));
 
gdkTheard->start();
И часть MyClass:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
void godanKeyRequest::process() {
 
QNetworkAccessManager* HTTPManager = new QNetworkAccessManager;
 
connect(HTTPManager, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(sendFinished(QNetworkReply*)));
 
connect(HTTPManager, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)),
                this, SLOT(slot_authenticationRequired(QNetworkReply*, QAuthenticator*)));
 
connect(HTTPManager, SIGNAL(encrypted(QNetworkReply *)),
                this, SLOT(slot_encrypted(QNetworkReply *)));
 
connect(HTTPManager, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)),
                this, SLOT(slot_networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)));
 
connect(HTTPManager, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)),
                this, SLOT(slot_proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)));
 
connect(HTTPManager, SIGNAL(sslErrors(QNetworkReply* , const QList<QSslError>&)),
                this, SLOT(slot_sslErrors(QNetworkReply* , const QList<QSslError>&)));
 
QNetworkRequest URLRequest(QUrl("http://godankey.com/panel/embed/request"));
URLRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
 
QNetworkReply * networkReply = HTTPManager->post(URLRequest, postData.toString(QUrl::FullyEncoded).toUtf8());
 
new QReplyTimeout(networkReply, 20000);
}
 
void godanKeyRequest::sendFinished(QNetworkReply* reply) {
    qDebug() << "sendFinished";
    int answer;
    if (reply->error() == QNetworkReply::NoError) {
        QString respone = reply->readAll();
 
        //qDebug() << respone;
 
        if (respone.indexOf("You already participated on this campaign") != -1) {
            answer = godanKeyRequest::ANSWER_ALREADY;
        }
        else if (respone.indexOf("You are already waiting for a key from this campaign") != -1) {
            //MW->keyRequested(GKproxy, GKmail, godanKeyRequest::ANSWER_ALREADY);
            answer = godanKeyRequest::ANSWER_ALREADY;
        }
        else if (respone.indexOf("Thanks for participating, you will receive an") != -1) {
            //MW->keyRequested(GKproxy, GKmail, godanKeyRequest::ANSWER_OK);
            answer = godanKeyRequest::ANSWER_OK;
        }
        else {
            //MW->keyRequested(GKproxy, GKmail, godanKeyRequest::ANSWER_NO);
            answer = godanKeyRequest::ANSWER_NO;
        }
 
    }
    else {
        //MW->keyRequested(GKproxy, GKmail, godanKeyRequest::ANSWER_NO);
        answer = godanKeyRequest::ANSWER_NO;
    }
 
    delete reply;
 
    emit sendComplete(this->GKproxy, this->GKmail, answer);
    emit finished();
}
Так вот суть проблемы: при запуске 50 потов всё идёт хорошо, отрабатывает 50 потоков - всё хорошо, опять запускается 50 потоков - всё хорошо, НО потом (может в любое время случиться) при очередном запуске потоков ошибка QThread::start: Failed to create thread (Код доступа неверен.). Ещё заметил, что количество этих ошибок не обязательно количеству запускаемых потоков (ошибок может быть и 5, а потов 50).
Могли бы Вы помочь?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2015, 16:17
Ответы с готовыми решениями:

QThread Передать даные из одного потока в другой
Надо передать данные из одного потока в другой. Использую сигнал и слот, ибо по-другому не умею, но...

Нужно ли страховаться функцией QThread::wait() при выходе из потока?
Ну вопрос в шапке. Собственно, если у меня ран выглядит так: (exit = false конечно же сначала) ...

QThread как очищать память при завершении работы потока?
В моей минипрограммке используется класс наследованный от QThread. Этот объект в качестве полей...

Ошибка создания потока
Создание потока if (!Running){ try{ _Running = true; ...

7
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.01.2015, 17:43 2
Так в принципе если парсит/обрабатывать рельтат не надо то можно и в одном потоке натравливать QNetworkAccessManager на ссылки у него как бы там свои потоки и очередь внутри.

Что касается ошибок то трудно понять что они означают, но по логике может быть из-за нехватки памяти или еще чего.
0
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
22.01.2015, 18:07  [ТС] 3
вот именно, что надо обработать результат

Добавлено через 22 минуты
судя по всему да, нехватка памяти, но почему? отработавшие потоки вроде бы завершаются правильно.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.01.2015, 18:11 4
C++ (Qt)
1
2
3
QNetworkAccessManager* HTTPManager = new QNetworkAccessManager;
//...
new QReplyTimeout(networkReply, 20000);
Ну так а где освобождение памяти?
0
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
22.01.2015, 18:13  [ТС] 5
я вас не очень понял, можно подробнее
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.01.2015, 18:17 6
Цитата Сообщение от aiselcms Посмотреть сообщение
я вас не очень понял, можно подробнее
Иди бери книгу по С++ для начинающих и учи и не лезь в Qt, еще подробнее?
Могу по-подробнее но цензуры не выдержит...
0
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
22.01.2015, 18:34  [ТС] 7
Большое спасибо за грамотный ответ. Ваше желание помогать выше всех похвал. Если не хотите помогать - зачем писать в теме? Или по вашему мнению вопрос задают от того, что всё знают? Удачи Вам.
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
22.01.2015, 20:35 8
Цитата Сообщение от aiselcms Посмотреть сообщение
Большое спасибо за грамотный ответ. Ваше желание помогать выше всех похвал. Если не хотите помогать - зачем писать в теме? Или по вашему мнению вопрос задают от того, что всё знают? Удачи Вам.
Лучше прислушайся к тому, что тут говорят знающие люди. Если ты не знаешь что такое new - тебе не с Qt надо разбираться, а с азами С++. Без азов С++ в C++\Qt делать нечего.
0
22.01.2015, 20:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2015, 20:35
Помогаю со студенческими работами здесь

SDL_Thread ошибка создания потока
int thrf(void* data) { return 0; } int main() { SDL_Thread* threadID =...

Ошибка при попытке создания потока
Привет, исправьте пожалуйста ошибку в моем коде. public void goga(int i) { ...

Ошибка С2280 при попытке создания потока
При попытке создания потока auto t = new thread(&amp;merge, fin, fout, maxmemory, p) вылезает error...

QThread ошибка
Здравствуйте У меня возникла следующая проблемка при создании потока. Получаю ошибку: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru