QIO Input Buffer

Alles rund um die Programmierung mit Qt
Antworten
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

QIO Input Buffer

Beitrag von rafilis1982 »

Hallo :)

wie kann ich mit QT festhalten, wieviel ich von einer Datei bereits gelesen habe um damit einen QProgressdialog zu füllen?

Wie erzeuge ich einen Input buffer mit dem ich einen gesteuerten Datenfluss erreiche um obiges sicherzustellen?

Bisherige Recherchen ergaben leider keine Erfolge :cry:
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Aktuelle Position: QIODevice::pos(). Und das mit deinem Eingabepuffer verstehe ich nicht...
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag von rafilis1982 »

Vielen Dank für deine Antwort. :)

Mal angenommen ich habe ein QFile Objekt f, mit dem ich eine XMl Datei öffnen möchte.

Kann ich dann einfach über f.pos() jederzeit den Status zurückgeben auch wenn ich mich in einer anderen Klasse befinde um dort Dateioperationen durchzuführen?

In dem Fall arbeit man am besten mit einem connect Befehl oder?

Mit welchem Befehl krieg ich die Maximalgrösse der Datei zurück?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Die groesse solltest mittels QFileInfo bekommen ... muss auch ned 100% genau sein fuer ne fortschrittsanzeige ...

Hab sowas mal fuer den Xerces mit C IO routinen gebaut, da hab ich es aequivalent gemacht ... dateigroesse ueber das BS abgefragt, und gegen die gelesenen Bytes verrechnet.

Ciao ...
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag von rafilis1982 »

Hab das ganze jetzt mal implementiert, doch bei mir liefert pos() immer nur 0 zurück.

Vlt am Beispiel von DomParser:

Code: Alles auswählen

bool LodParser::InitDomParser(const char* lpcszXMLFile, logger *logDOM, QProgressDialog* pd)
{
.
.
.
else
	{
		if (doc) 
		{
			XmlBase2Dialog::Parse(doc);
		}		
	}
.
.
.

Code: Alles auswählen

void XmlBase2Dialog::Parse( xercesc::DOMDocument *doc)
{
    if (doc)
	{				
		if (doc->getNodeType() == DOMNode::DOCUMENT_NODE)
		{
			DOMNode	*root = doc->getFirstChild();//first node
			
			emit dataReadProgress();

			QTreeWidgetItem* hRoot = createItem(root,0);

			if(hRoot)
				m_nXmlCount++;
		
			while( root )
			{
				emit dataReadProgress();

				ParseChildren(root,hRoot,m_nXmlCount);

				root = root->getNextSibling();
			}
		}
	}
}

Code: Alles auswählen

void MView::updateDataReadProgress(void)
{
	pd->setValue(xmlFile->pos());
	cout << xmlFile->pos() << endl;
}
Über dataReadProgress lass ich mir den Fortschritt über updateDataRead ausgeben, doch der ist dauerhaft 0.

Wo ist der fehler?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann gäbe es ja noch QXmlInputSource oder QXmlStreamReader aber ob die mit deinen Anforderungen verwendbar sind ist eine andere Frage...
rafilis1982
Beiträge: 34
Registriert: 6. Juni 2008 14:44

Beitrag von rafilis1982 »

Die sind leider für mich unbrauchbar.

Ist denn irgendwie ein Denkfehler in meiner Programmierung enthalten?

Ich erstelle mein QFile Objekt, öffne die Datei, gehe in meine XML Klasse um dort die XML Datei zu parsen.

Im Beispiel meines Xerces DomBuilders rufe ich zunächst

Code: Alles auswählen

XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc = 0;
doc = parserDOM->parseURI(xmlFile); 
auf, um anschließend mit "doc" weiterarbeiten zu können.

Doch versuche ich dann die per Signalaufruf die Position abzufragen ist diese dauerhaft 0?!?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ja du gehst eigentlich falsch ran, du solltest die Positionen eigentlich ned von aussen lesen ...
qint64 QIODevice::pos () const [virtual]
For random-access devices, this function returns the position that data is written to or read from. For sequential devices or closed devices, where there is no concept of a "current position", 0 is returned.
Du liesst schoen hintereinander aus dem file im readonly modus, und dein Parser hat ja keinen plan, das es sich um random access faehiges "device" handelt = du hasst nen typisches "sequential devices" was durch nen QFile nur bedient wird .... pos muss also immer 0 sein ....

DU musst dich also definitiv in den Leseprozess einschieben .....

variante 1:
QIODevice neu implementieren .....

variante 2:
QXmlInputSource implementieren ....

Klingt schwerer als es ist :-)

Nen QIODevice mittels QFile implementieren, wo dich nur in die readmethode einklingst, sollt recht fix gehen ...

Ciao ...
Antworten