crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QUuid::createUuid();, в дочернем потоке guid не уникален. :(
ViGOur
  опции профиля:
сообщение 5.10.2009, 17:11
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


все досточно просто, если генерирую guid в основном потоке, то все ок;
int main(int argc, char *argv[])
{
    qInstallMsgHandler(myMessageOutput);

    CCoreApplication a( argc, argv);

    QUuid guid;
    guid = QUuid::createUuid()
    qDebug() << "guid: " << m_guid.toString();

    return a.exec();
}
если я это делаю из дочернего потока, то гуид не уникален, скорее всего конено же это вечерний ступор, но все же я пока не могу понять почему! :)
Все лишнее я убрал, кроме как CCoreApplication::rssDo оставил получение данных из xml файла настроек и дальнейшая работа.

Вот код:
main.cpp
#include <QtCore>

#include "CoreApplication.h"
#include <QUuid>

int main(int argc, char *argv[])
{
    CCoreApplication a( argc, argv);

    return a.exec();
}

CoreApplication.h

/*
* CoreApplication.h
*
*  Created on: 05.10.2009
*      Author: vigour
*/

#ifndef COREAPPLICATION_H_
#define COREAPPLICATION_H_

#include <QCoreApplication>

class QTimer;

class CCoreApplication: public QCoreApplication
{
    Q_OBJECT

private:
    QTimer *m_pTimer;

public:
    CCoreApplication( int &argc, char **argv);
    virtual ~CCoreApplication();

public:
    bool CreateThread( QString szUrl, QString szType);

protected Q_SLOTS:
    void rssDo();
    void DeleteThread();
};

#endif /* COREAPPLICATION_H_ */

CoreApplication.cpp

/*
* CoreApplication.cpp
*
*  Created on: 05.10.2009
*      Author: vigour
*/

#include <QTimer>

#include "CoreApplication.h"
#include "debug.h"

CCoreApplication::CCoreApplication( int &argc, char **argv):QCoreApplication::QCoreApplication( argc, argv)
{
    OUT_DEBUG;

    m_pTimer = new QTimer( this);
    connect( m_pTimer, SIGNAL( timeout()), this, SLOT( rssDo()));
    m_pTimer->setInterval( 3000);
    m_pTimer->start();
}

CCoreApplication::~CCoreApplication()
{
    OUT_DEBUG;

    m_pTimer->stop();
    m_pTimer->deleteLater();
}

void CCoreApplication::rssDo()
{
    OUT_DEBUG;

    qDebug() << " *** rssDo ***";

    CxXmlParam xp;
    if( xp.Fill())
    {
        QList<CxAppValue *>::iterator pIter;
        for( pIter = xp.m_listValues.begin(); pIter != xp.m_listValues.end(); ++pIter)
        {
            CxAppValue *pav = (CxAppValue *)*pIter;
            if( pav)
            {
                qDebug() << pav->GetUrl() << " " << pav->GetStringType();

                CreateThread( pav->GetUrl(), pav->GetStringType());
            }
        }
    }

}

bool CCoreApplication::CreateThread( QString szUrl, QString szType)
{
    OUT_DEBUG;

    CxLoader *pLoader=new CxLoader( this, szUrl, szType);
    if( !pLoader)
    {
        qDebug() << "pLoader is NULL...";
        return false;
    }
    qDebug( "pLoader is %x", (unsigned int)pLoader);

    connect( pLoader, SIGNAL( finished()), this, SLOT( DeleteThread()));
    pLoader->start();

    return true;
}

void CCoreApplication::DeleteThread()
{
    OUT_DEBUG;

    CxLoader *pLoader = qobject_cast<CxLoader *>(sender());
    if( pLoader)
    {
        qDebug( "Delete thread: 0x%x", (unsigned int)pLoader);
        pLoader->deleteLater();
    }
}

xLoader.h

/*
* xLoader.h
*
*  Created on: 29.09.2009
*      Author: vigour
*/

#ifndef XLOADER_H_
#define XLOADER_H_

#include <QObject>
#include <QThread>


class CxLoader: public QThread
{
    Q_OBJECT

public:
    CxLoader( QObject *pParent);
    CxLoader( QObject *pParent, QString szUrl, QString szType);
    virtual ~CxLoader();

public:
    void run();
};

#endif /* XLOADER_H_ */

xLoader.cpp

/*
* xLoader.cpp
*
*  Created on: 29.09.2009
*      Author: vigour
*/

#include <QUuid>

#include "xLoader.h"
#include "debug.h"


CxLoader::CxLoader(QObject *pParent):QThread::QThread( pParent)
{
    OUT_DEBUG;
}

CxLoader::CxLoader( QObject *pParent, QString szUrl, QString szType):QThread::QThread( pParent)
{
    OUT_DEBUG;

}


CxLoader::~CxLoader()
{
    OUT_DEBUG;
}

void CxLoader::run()
{
    OUT_DEBUG;

    QUuid guid;
    guid = QUuid::createUuid();
    qDebug() << "guid: " << guid.toString();

    exec();
}


да забыл сказать, работаю под Ubuntu 9.04 + eclipse

Сообщение отредактировал ViGOur - 5.10.2009, 17:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.10.2009, 10:07
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Блин, как я понимаю это баг, причем давний и не исправленный. :(
171206 - QUuid::createUuid() is not reseeded when called from multiple threads
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.10.2009, 10:14
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Может стоит перезапостить, с указанием того, что есть такой-то taskID и он повис. Вдруг забыли, головников-то у них хватает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.10.2009, 10:29
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


фиг знает, будет время сам поправлю. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 8:15