Seite 1 von 1

QIO Input Buffer

Verfasst: 24. Juli 2008 10:38
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:

Verfasst: 24. Juli 2008 12:26
von upsala
Aktuelle Position: QIODevice::pos(). Und das mit deinem Eingabepuffer verstehe ich nicht...

Verfasst: 24. Juli 2008 13:11
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?

Verfasst: 24. Juli 2008 13:46
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 ...

Verfasst: 24. Juli 2008 17:16
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?

Verfasst: 24. Juli 2008 20:21
von upsala
Dann gäbe es ja noch QXmlInputSource oder QXmlStreamReader aber ob die mit deinen Anforderungen verwendbar sind ist eine andere Frage...

Verfasst: 24. Juli 2008 21:10
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?!?

Verfasst: 28. Juli 2008 11:27
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 ...