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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не создаются потоки  (Прочитано 8113 раз)
dware
Гость
« : Июнь 23, 2010, 20:48 »

пытаюсь создать 3 потока в main в цикле while:

Код:
#include <QtGui/QApplication>
#include <time.h>
#include "mainwindow.h"
#include "MyThread.h"
#include "Ship.h"
#include "Port.h"
#include "Scene.h"
#include <QTimer>

int main(int argc, char *argv[])
{
    //Generating random number
    const time_t timer = time(NULL);
    tm *timerstruct = localtime(&timer);
    uint sec = timerstruct->tm_sec;
    qsrand(sec);
    int random = qrand()%3;

    QApplication a(argc, argv);
    MainWindow w;
    w.setFixedSize(550,600);
    w.show();

    Port* port = new Port;
    Scene *scene = w.getScene();

    int i=1;
    while(i<4)
    {
        MyThread thread(random,port,scene);

        QObject::connect(&thread,
                     SIGNAL(shipMoves(Ship *, qreal, qreal)),
                     scene,
                     SLOT(moveShip(Ship *, qreal, qreal)));

        QObject::connect(&thread,
                     SIGNAL(shipRotates(Ship *, qreal, qreal, qreal, qreal)),
                     scene,
                     SLOT(rotateShip(Ship *, qreal, qreal, qreal, qreal)));

        QObject::connect(&thread,
                     SIGNAL(newShip(Ship*)),
                     scene,
                     SLOT(addNewShip(Ship*)));
        QTimer timer;
        timer.singleShot(i*5000, &thread, SLOT(start()));
        i++;
    }

    return a.exec();
}

но в итоге ничего не создаётся. хотя если вручную создать эти 3 потока, то все создаются и работают. почему так?
« Последнее редактирование: Июнь 23, 2010, 20:56 от dware » Записан
BRE
Гость
« Ответ #1 : Июнь 23, 2010, 20:50 »

Сначала нужно выучить C++! Обязательно!  Подмигивающий

hint: при выходе из цикла все локальные переменные разрушаются.
Записан
zenden
Гость
« Ответ #2 : Июнь 23, 2010, 20:51 »

ну наверно потому, что вы создаете объекты MyThread  и QTimer  в стеке и при выходе из блока (вернее на каждом шаге цикла) они уничтожаются  Подмигивающий
Записан
dware
Гость
« Ответ #3 : Июнь 23, 2010, 20:53 »

уничтожаются, да, но до этого они должны создаться и поработать. или нет?))
Записан
BRE
Гость
« Ответ #4 : Июнь 23, 2010, 20:54 »

уничтожаются, да, но до этого они должны создаться и поработать. или нет?))
Не успевают они.  Улыбающийся
Записан
dware
Гость
« Ответ #5 : Июнь 23, 2010, 20:55 »

а как тогда создать устанавливаемое пользователем количество потоков?
Записан
BRE
Гость
« Ответ #6 : Июнь 23, 2010, 20:59 »

Не обижайся, но очень рекомендую:
Цитировать
Сначала нужно выучить C++! Обязательно!

Методом тыка можно заставить что-то заработать, но работать оно будет плохо.  Улыбающийся
Записан
dware
Гость
« Ответ #7 : Июнь 23, 2010, 21:05 »

я не спорю, что знаю неважно. в универе требуют лабораторную - многопоточное приложение, хотя эта тема нам совсем не объяснялась. в страуструпе про потоки ничего не нашёл (есть про те, которые stream, а не про те, которые thread). вот и мучаюсь)
Записан
BRE
Гость
« Ответ #8 : Июнь 23, 2010, 21:11 »

я не спорю, что знаю неважно. в универе требуют лабораторную - многопоточное приложение, хотя эта тема нам совсем не объяснялась. в страуструпе про потоки ничего не нашёл (есть про те, которые stream, а не про те, которые thread). вот и мучаюсь)
В данном случае, самый простой способ создать их в куче, т.е. через оператор new, тогда они будут жить и после выхода из блока цикла.

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 23, 2010, 22:03 »

хреново, когда программа обучения дошла уже до потоков, а знания о времени жизни (и области видимости) переменных - нуль
Записан

Юра.
dware
Гость
« Ответ #10 : Июнь 25, 2010, 03:08 »

BRE, спасибо, разобрался
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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