QThread mit QMutex Console QMutex:destroying
-
Hallo,
versuche mich gerade mit Beispielen und Youtube in das Thema QThread einzuarbeiten bevor ich in Richtung Netzwerkprogrammierung gehe.
Hier mein Code:mythread.h
@#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QtCore>class MyThread : public QThread
{
public:
MyThread();
void run();
QString name;
bool Stop;
};#endif // MYTHREAD_H@
mythread.cpp
@#include "mythread.h"
#include <QtCore>
#include <QtDebug>MyThread::MyThread()
{
}void MyThread::run()
{
qDebug() << this->name << " Running";for(int i = 0; i<1000;i++) { QMutex mutex; mutex.lock(); if(this->Stop) break; mutex.unlock(); this->sleep(1); qDebug() << this->name << i; }
}@
Main:
@#include <QCoreApplication>
#include <mythread.h>int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);MyThread mThread1; mThread1.name = "mThread1"; MyThread mThread2; mThread2.name = "mThread2"; MyThread mThread3; mThread3.name = "mThread3"; mThread1.start(); //mThread2.start(); //mThread3.start(); //mThread1.Stop = true; return a.exec();
}@
Als Ausgabe auf der Konsole bekomme ich folgende Meldung:
"mThread1" Running
QMutex: destroying locked mutexIst nicht die Ausgabe, die ich erwartet hätte.
der @mThread1.Stop = true;@ wurde in der main auskommentiert und so müsste @mThread1.start();@ normal ausgeführt werden ohne in der if (siehe mythread.cpp) die Abbruch Bedingung zu erfüllen. Es müsste bis 999 gezählt werden oder sehe ich hier was falsch?
Gruß
Alex
-
Du hast glaube ich einen Denkfehler.
if(this->Stop)
break;sorgt dafür, dass Du die For-Schleife sofort verläßt, also bevor der Mutex "geunlockt" wird. Da der Mutex aber (sinnloserweise) in der Schleife deklariert worden ist, ist die Fehlermeldung vollkommen richtig, dass ein gelockter Mutex destroyed worden ist.
Der Mutex ist an der Stelle übrigens tatsächlich völlig sinnlos. Wenn Du die Stop-Variable über einen Mutex schützen willst, was übrigens auch überflüssig ist, solltext Du den Mutex als Member von MyThread deklarieren.
Gruß,
Tobias -
Also das Beispiel habe ich von folgendem Video heraus:
http://www.youtube.com/watch?v=5WEiQ3VJfxc&index=31&list=PL2D1942A4688E9D63