Thread und die Aktualisierung der Tabelle
Thread und die Aktualisierung der Tabelle
Ich habe eine Thread Funktion die aller 1er Sekunde eine Row einer Tabelle hinzufügt und das 100 mal. Leider werden die einzelnen Rows erst nach den einhundert erstellten angezeigt. Woran liegt das?
Debian 2.4.27-1-386
[...]peace, love and empathy
[...]peace, love and empathy
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Code: Alles auswählen
MyThread bla(this);
bla.start();
bla.wait();
void MyThread::run()
{
for(int i=0; i<100;++i)
{
_toni->_form4->addRow(i);
usleep(1000000);
}
}
void Form4::addRow(int row)
{
Tabelle->insertRows(row);
Tabelle->showRow(row);
}
Debian 2.4.27-1-386
[...]peace, love and empathy
[...]peace, love and empathy
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
...jetzt wo du das sagstFlorianBecker hat geschrieben: Na ist doch logisch, das Gaspedal drückt nicht genügend Sprit in den Motor.
Zeit vielleicht schon, aber du willst das doch nichtrulzmaker hat geschrieben: Nix mit Gaspedal....der main Thread hat genug Zeit um alles zu zeichnen!
Mit deinem bla.wait() sagst du deinem Main Thread doch, dass er warten soll, bis die 100 Zeilen eingefuegt sind.
Goos
Hab nun neues Projekt mit qt designer erstellt:
Und siehe an es funktioniert...ihr scheint nicht wirklich viel Erfahrung mit thread zu haben.
PS: mit den send events hatte ich schon herumexperimentiert, kam aber nichts gescheites außer Speicherschutzverletzungen heraus (ich nahm das update event).
Code: Alles auswählen
#include <qapplication.h>
#include "fenster.h"
#include <qtable.h>
#include <qthread.h>
QTable *tab;
class MyThread : public QThread
{
public:
virtual void run();
};
void MyThread::run()
{
for(int i=0; i<20; ++i)
{
tab->insertRows(i);
tab->showRow(i);
sleep(1);
}
}
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
Form1 w;
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
tab=w.getTable();
MyThread t;
t.start();
return a.exec();
}
PS: mit den send events hatte ich schon herumexperimentiert, kam aber nichts gescheites außer Speicherschutzverletzungen heraus (ich nahm das update event).
Debian 2.4.27-1-386
[...]peace, love and empathy
[...]peace, love and empathy
Ach verdammt. Es funxt doch nicht...ich Trottel ;-(
Ich probiers nun doch nochmal mit den Events...Könnt ihr mir dabei Helfen - hab es gestern vergeblich versucht.
Seitdem ich das mit dem Event drin habe, kommt kurz nach dem Aufruf des Programmes eine Speicherschutzverletzung.
Ich probiers nun doch nochmal mit den Events...Könnt ihr mir dabei Helfen - hab es gestern vergeblich versucht.
Code: Alles auswählen
#include <qapplication.h>
#include "fenster.h"
#include <qtable.h>
#include <qthread.h>
#include <qevent.h>
class MyThread : public QThread
{
public:
MyThread(QTable *tabelle,QApplication *app);
virtual void run();
private:
QTable *_tabelle;
QApplication *_app;
};
MyThread::MyThread(QTable *tabelle,QApplication *app)
:QThread()
{
_tabelle=tabelle;
_app=app;
}
void MyThread::run()
{
QEvent *event=new QEvent(QEvent::Paint);
for(int i=0; i<10; ++i)
{
_tabelle->insertRows(i);
_tabelle->showRow(i);
_app->postEvent(_tabelle, event);
sleep(1);
}
}
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
Form1 w;
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
MyThread t(w.getTable(), &a);
t.start();
return a.exec();
}
Debian 2.4.27-1-386
[...]peace, love and empathy
[...]peace, love and empathy
Habs gelöst (jippie aufschrei). Das lag warscheinlich daran das auch noch andere Threads auf das Tabellen widget zugreifen und mein Thread mit den anderen ins Gehege kam. QMutex löst das Problem:
EDIT: lol...shit happens. Wennich das Fenster ganz ganz schnell verkleinere/vergrößere kommt folgendes:
Xlib: unexpected async reply (sequence 0x58a2)!
Code: Alles auswählen
#include <qapplication.h>
#include "fenster.h"
#include <qtable.h>
#include <qthread.h>
#include <qevent.h>
#include <qmutex.h>
QTable *tab;
class MyThread : public QThread
{
public:
MyThread(QTable *tabelle,QApplication *app, Form1 *fenster);
virtual void run();
private:
QTable *_tabelle;
QApplication *_app;
Form1 *_fenster;
};
MyThread::MyThread(QTable *tabelle,QApplication *app,Form1 *fenster)
:QThread()
{
_tabelle=tabelle;
_app=app;
_fenster=fenster;
}
void MyThread::run()
{
QMutex mutex;
QEvent *event=new QEvent(QEvent::Paint);
for(int i=0; i<100; ++i)
{
_tabelle->insertRows(i);
mutex.lock();
_tabelle->showRow(i);
_app->sendEvent(_fenster, event);
mutex.unlock();
sleep(1);
}
_app->sendEvent(_fenster, event);
}
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
Form1 w;
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
MyThread t(w.getTable(), &a, &w);
t.start();
return a.exec();
}
Xlib: unexpected async reply (sequence 0x58a2)!
Debian 2.4.27-1-386
[...]peace, love and empathy
[...]peace, love and empathy