Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: dware от Июнь 23, 2010, 20:48



Название: Не создаются потоки
Отправлено: 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 потока, то все создаются и работают. почему так?


Название: Re: Не создаются потоки
Отправлено: BRE от Июнь 23, 2010, 20:50
Сначала нужно выучить C++! Обязательно!  ;)

hint: при выходе из цикла все локальные переменные разрушаются.


Название: Re: Не создаются потоки
Отправлено: zenden от Июнь 23, 2010, 20:51
ну наверно потому, что вы создаете объекты MyThread  и QTimer  в стеке и при выходе из блока (вернее на каждом шаге цикла) они уничтожаются  ;)


Название: Re: Не создаются потоки
Отправлено: dware от Июнь 23, 2010, 20:53
уничтожаются, да, но до этого они должны создаться и поработать. или нет?))


Название: Re: Не создаются потоки
Отправлено: BRE от Июнь 23, 2010, 20:54
уничтожаются, да, но до этого они должны создаться и поработать. или нет?))
Не успевают они.  :)


Название: Re: Не создаются потоки
Отправлено: dware от Июнь 23, 2010, 20:55
а как тогда создать устанавливаемое пользователем количество потоков?


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

Методом тыка можно заставить что-то заработать, но работать оно будет плохо.  :)


Название: Re: Не создаются потоки
Отправлено: dware от Июнь 23, 2010, 21:05
я не спорю, что знаю неважно. в универе требуют лабораторную - многопоточное приложение, хотя эта тема нам совсем не объяснялась. в страуструпе про потоки ничего не нашёл (есть про те, которые stream, а не про те, которые thread). вот и мучаюсь)


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



Название: Re: Не создаются потоки
Отправлено: lit-uriy от Июнь 23, 2010, 22:03
хреново, когда программа обучения дошла уже до потоков, а знания о времени жизни (и области видимости) переменных - нуль


Название: Re: Не создаются потоки
Отправлено: dware от Июнь 25, 2010, 03:08
BRE, спасибо, разобрался