Seite 1 von 1

Zufallszahlen in Threads

Verfasst: 1. September 2014 13:18
von serious_sammy
Hallo zusammen,
ich möchte via qsrand() und qrand() ein paar "Zufallszahlen" in einem Worker-Thread generieren.
Dabei habe ich fest gestellt das ein seeden im Konstruktor meiner Worker-Klasse nicht funktioniert und ich immer die gleiche Zahlenfolger erhalte. Das liegt daran das qrand() nur in der eigenen Thread-Umgebung ausgeführt wird, als seed wird immer die aktuelle Zeit benutzt (QTimer::currentTime.msec()) .

https://stackoverflow.com/questions/313 ... dom-number

Also habe ich meine seeding Methode aus dem Konstruktor genommen und nutze nun einen SingleShotTimer um die Methode einmal aufzurufen.
Leider ohne Erfolg ich erhalte immer die gleiche Zahlenfolge.


Abhilfe scheit es zu geben wenn man die Threadklasse ableitet und qsrand() in der run-Methode aufruft. Allerdings nutze ich meine Threads völlig anders, ich erstelle erst mein Workerobjekt und verschiebes es dann in denn Thread um diesen anschließend zu starten.

Hat jemand ggf. eine Idee wie man diese Problem umgehen könnte?
Vielen Dank Sammy

Re: Zufallszahlen in Threads

Verfasst: 1. September 2014 13:32
von serious_sammy
hier noch ein paar code schnipsel:

Worker::Worker(QObject *parent) :
QObject(parent)
{
i = 0;
}

int Worker::set_seed()
{
int y = QTime::currentTime().msec();
qsrand(y);
return 0;
}

int Worker::getData()
{
int x = qrand();
return x;
}

void Worker::on_timeout()
{
//int temp = getData()%100;
int temp = i++;
int dose = getData()%100;
emit sendData(temp, dose);
//qDebug() << temp << " " << dose;
}

void Worker::on_seed()
{
set_seed();
}

###########################################

backgroundworker = new Worker();
workerThread = new QThread(this);
backgroundworker->moveToThread(workerThread);
workerThread->start();

// the timer which controls the worker to get data
QTimer::singleShot(0,backgroundworker,SLOT(on_seed()));

timer = new QTimer(this); // triggers getData every second
timer->start(1000);

Re: Zufallszahlen in Threads

Verfasst: 1. September 2014 18:33
von Sourcerer
Hallo,

ich denke die Aufrufe von qsrand und getData passieren in unterschiedlichen Threads.

on_seed wird bei Dir über den SingleShot aufgerufen und läuft wegen der Signal-Slot Verbindung, welche standardmäßig eine QT::AutoConncection ist, in dem von dir erstellten workerThread.
Wenn du jetzt GetData explizit aufrufst läuft diese im aufrufenden Thread.
Da qsrand threadlokal arbeitet siehe: http://qt-project.org/doc/qt-5/qtglobal.html#qsrand benutzt du ein anderes seed als beim Aufruf durch SingleShot.

Gruß Sourcerer

Re: Zufallszahlen in Threads

Verfasst: 9. Oktober 2014 11:08
von serious_sammy
Hallo,
danke für die Antwort und sorry das ich mich jetzt erst melde.

Naja ich dachte eigentlich dadurch das ich ein Worker bzw. ein Objekt der Klasse Worker erstelle das "set_seed()" und "get_data()" im gleichen Thread ausgeführt werden, da beide Aufrufe zum gleiche Objekt gehören. Oder kann Objekt Code in zwei verschiedenen Threads ausführen?

Bis dann Sammy