PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : qt kriegt seine widgets nicht gezeichnet....



soul_rebel
03-05-2005, 00:48
ich hab eine kde-anwendung und öffne in einen thread eine pipe aus der ich dann daten auslesen und diese blockweise in ein KTextEdit schreibe. das sieht so aus:

char buffer[1500]="";
char prebuffer[1500]="";

while (!feof(installPipe))
{
fgets(buffer, 300, installPipe);
if (strcmp(buffer,prebuffer)!=0)
m_parent2->tOutput->append(buffer);

strcpy(prebuffer,buffer);
}
da fgets kontinuierlich daten ausließt prüft das if argument in der mitte noch ob die daten wirklich neu sind bevor es sie in das textedit schreibt. so weit so gut, ABER qt verursacht seltsame fehler dabei; das programm friert ein, d.h. alles friert ein außerdem textedit, dafür sehen die scrollbars vom textedit sehen aus wie ein bildstörung im fernsehen...
das programm stürtzt aber nicht ab, kein segfault oder buserror oder so also hilft gdb auch nciht weiter. auf der konsole krieg ich dafür ein
xlib: unexpected async reply (sequence 0xdd9d1)!
uns SEHR viele:
QPixmap::operator=: Cannot assign to pixmap during painting
also bin ich davon ausgegangen dass das widget einfach zu oft neugezeichnet wird und hab (da das ganze ja in nem thread abläuft) einfach ein msleep(1000) (1 sekunde) in schleife vor das append gepackt aber es hilft nciht....
hat jemand eine idee?

anda_skoa
03-05-2005, 09:19
ABER qt verursacht seltsame fehler dabei; das programm friert ein

Genau genommen produzierst du diesen Fehler, denn du nimmst den Thread der Eventloop, beschäftigst ihn in einer Schleife und gibts ihn erst am Ende wieder frei.
Damit kann die Eventloop logischerweise bis zum Ende der Schleife auch nichts tun.

Wahrscheinlich ist es relativ einfach das Lesen aus der Pipe non-blocking zu machen, ich denke da in die Richtung QSocketNotifier

Ciao,
_

peschmae
03-05-2005, 10:14
Er sagt er habe einen eigenen Thread fürs lesen. Da sollte das Problem doch eigentlich genau nicht auftreten?

MfG Peschmä

soul_rebel
03-05-2005, 11:21
ja das ganze läuft in einem eigenen thread solte also kein problem sein....
durch setzen von einem großen timeout habe ich jetzt rausgefunden dass der fehler erst auftritt sobald eine line in den edit geschrieben ist die breiter ist als das widget, also eine horiontale scrolline eingeblendet wird. wenn in dem textedit die horizontale scrolline aber auf allwaysoff und wordwrap eingeschaltet wird klappt es ohne probleme....
glaube also nicht das der fehler bei mir liegt, überlege ob ich das mal bei qt reprten soll... oder meint ihr es liegt doch am code?

anda_skoa
03-05-2005, 18:00
Wenn das in einem extra Thread abläuft, kannst du in diesem Thread nicht auf Widgets zugreifen.

Nur der Hauptthread, also der Eventloopthread, darf das.

Du kannst zB mit einem CustomEvent Daten an Klassen im Kontext des Hauptthreads weitergeben, oder sie wie bei multithreading üblich über gemeinsame gesicherte Datenstrukturen austauchen und entweder diese Strukturen im Hauptthread mit einem QTimer pollen oder den Haupthread mit Events dazu bewegen, die Strukturen zu kontrollieren.

Allerdings ist das Benutzen von Mechanismens zur nichtblockierenden Ein-/Ausgabe meistens wesentlich weniger Aufwand und wesenlicht leichter zu debuggen.

Ciao,
_