Threads
Verfasst: 9. Februar 2006 16:40
Hi Alle,
nachdem ich meine Threads nun erfolgreich starten kann
ein Problemchen, nämlich race conditions zu vermeiden.
Ich habe hier eine Threadclasse die viele Daten über Eigenschaften entgegen nimmt und dann über start() und run() eine xml Datei bedient. Das klappt, das klappt auch mehrfach hintereinander, allerdings nicht immer: Die Threadklasse ist also nicht threadsafe.
Mit QMutex und QWaitCondition komme ich nicht klar, weil QWaitCondition immer sperrt. QThreadStorage (TLS) wäre mir zu umständlich.
Hat jemand eine Idee, wie man das bewerkstelligen könnte?
hier ist die Headerfile der Klasse, es folgt in der Implementierung nur noch die run() Methode mit der Speicherung der Daten in eine XML-Datei:
Und diese Action hier feuert sie:
nachdem ich meine Threads nun erfolgreich starten kann
ein Problemchen, nämlich race conditions zu vermeiden.
Ich habe hier eine Threadclasse die viele Daten über Eigenschaften entgegen nimmt und dann über start() und run() eine xml Datei bedient. Das klappt, das klappt auch mehrfach hintereinander, allerdings nicht immer: Die Threadklasse ist also nicht threadsafe.
Mit QMutex und QWaitCondition komme ich nicht klar, weil QWaitCondition immer sperrt. QThreadStorage (TLS) wäre mir zu umständlich.
Hat jemand eine Idee, wie man das bewerkstelligen könnte?
hier ist die Headerfile der Klasse, es folgt in der Implementierung nur noch die run() Methode mit der Speicherung der Daten in eine XML-Datei:
Code: Alles auswählen
#ifndef m_SAVER_H
#define m_SAVER_H
#include <QThread>
#include "sax2.h"
class QString;
class QColor;
class SAX2;
class Saver : public QThread{
private:
QString TabellenName;
SAX2 *xmlfile;
int Mode;
int rowID;
int colID;
QString sAttr;
int nPos;
QString sFont;
int nSize;
bool bBold;
bool bItalic;
bool bUnderl;
bool bUnters;
int nWidth;
int nHeight;
QColor backcolor;
QColor forecolor;
void run();
public:
void setXMLFile(SAX2 *pSax) { xmlfile = pSax; };
void setMode(int nMode) { Mode = nMode; };
void setTabName(QString sTab) { TabellenName = sTab; };
void setRowID(int row) { rowID = row; };
void setColID(int col) { colID = col; };
void setAttr(QString sAt) { sAttr = sAt; };
void setPos(int np) { nPos = np; };
void setFont(QString sf) { sFont = sf; };
void setSize(int s) { nSize = s; };
void setBold(bool b) { bBold = b; };
void setItalic(bool i) { bItalic = i; };
void setUnderLine(bool u) { bUnderl = u; };
void setWidth(int w) { nWidth = w; };
void setHeight(int h) { nHeight = h; };
void setBackcolor(QColor bc) { backcolor = bc; };
void setForecolor(QColor fc) { forecolor = fc; };
};
#endifCode: Alles auswählen
for(i=0;i<qr.count();i++){
qr[i]->setBackgroundColor(r);
if(xmlfile != NULL){
savers[i] = new Saver();
savers[i]->setTabName(tb);
savers[i]->setMode(2);
savers[i]->setRowID(qt->item(inx[i].row(), pos)->text().toInt());
savers[i]->setPos(inx[i].row());
savers[i]->setAttr("BackColor");
savers[i]->setBackcolor(r);
savers[i]->setColID(inx[i].column());
savers[i]->setHeight(qt->rowHeight(inx[i].row()));
savers[i]->setWidth(qt->columnWidth(inx[i].column()));
savers[i]->setXMLFile(xmlfile);
//Saver-Thread start ...
savers[i]->start(QThread::HighPriority);
}
}