PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme QT und Signals



sebbel
29-10-2004, 18:56
Hi,

ich habe das Serial-Terminal-Programm Commi geschrieben und habe dies erst zeilenorientiert geschrieben und jetzt wollte ich es wie minicom auch noch zeichenorientiert einstellbar machen. (Das tut jetzt nix zum Problem)

Also ich habe das Problem, dass das Programm Zeichen verschluckt...
nun habe ich die ganzen Funktionen mal rauskopiert und ein neues QT-Projekt erstellt und dort die wichtigsten Komponenten eingefügt.
Und siehe da es funktioniert !!

So nun meine eigentliche Frage :
Kann es durch zu viele Signal-Slot-Verbindungen dazu kommen, dass das Programm die Abarbeitung nicht mehr schafft und dann manche Calls einfach auslässt !?
Weil in meinem richtigen Programm sind doch durch das Menü schon sehr viele Signal-Slot (~20) und bei meinem Test-Programm sind es dann grade 2
Oder könnte es am verwendeten QSocketNotifier liegen, dass dieser Probleme bekommt, wenn nur immer ein Zeichen zum lesen bereit steht !?

Da ich leider nicht weiß, wie ich dieses Problem jetzt weiter angehen soll, hoffe ich einfach, dass mir einer von Euch helfen kann.
Wenn Ihr den Quellcode von der aktuellen Hauptversion haben wollt um etwas zu analysieren, dann sagt einfach Bescheid.

Ich danke Euch für die große Mühe und hoffe, dass Ihr den Fehler sofort findet (also keine Syntax, da es ja einwandfrei läuft..nur halt Zeichen verschluckt, wenn man zu schnell tippt)

Gruß
Sebastian



// wurde verbunden mit meiner von TextEdit abgeleiteten Klasse und wird ausgelöst, wenn immer eine Taste betätigt wird
void Form1::send( int key )
{
sendByte((char) key);
}

//schreibt immer ein Zeichen nach /dev/ttyS0
bool Form1::sendByte(int c)
{
int res= write(fd, &c, 1);
if (res<1) return false;
return true;
}

// Funktion zum auslesen von Daten.. wird von QSocketNofitier aufgerufen, wenn Daten zum Lesen zur Verfügung stehen am /dev/ttyS0
output ist entweder ein TextBrowser oder halt das TextEdit
void Form1::readData() {
int bytesread = read(fd, buf, 4096);
QString text="";
if(bytesread<0) return;
char *c = buf;
bool test=false;
for( int i=0; i< bytesread; i++) {
if ((isprint(*c)) || (*c=='\n') || (*c=='\r'))
{
if (*c!='\r')
text += *c;
}
else
{
if(*c==8 && !test) {
output->setSelection(output->paragraphs()-1,output->paragraphLength(output->paragraphs()-1)-1,output->paragraphs()-1,output->paragraphLength(output->paragraphs()-1));
output->removeSelectedText();
test = true;
}
else if(test) {
test = false;
text = text.stripWhiteSpace();
}
else {
char buf2[16];
unsigned int i=*c;
snprintf(buf2, 16, "\\0x%02x", i & 0xff);
text+=buf2;
}
}
c++;
}
output->setCursorPosition(output->paragraphs()-1,output->paragraphLength(output->paragraphs()-1));
output->insert(text.latin1());
}


// ich hab zur Vollständigkeit mal die init-Funktion noch mit rein gemacht
void Form1::init() {
fd = open("/dev/ttyS0",O_RDWR | O_NDELAY);
sn = new QSocketNotifier(fd, QSocketNotifier::Read, this);
QObject::connect( sn, SIGNAL(activated(int)),
this, SLOT(readData()) );
output=myTextEdit1;
}

//*********************************************
// diese Funktionen sind nur für den zeilenorientierten Modus
//********************************************

// sendet String zeichenweise über sendbyte -Funktion
bool Form1::sendString(const QString& s)
{
const char *bytes=s.latin1();
for (unsigned int i=0; i<s.length(); i++)
{
if (!sendByte(*bytes))
return false;
bytes++;
// millisleep(1);
}
if (!sendByte(13)) // '\n'
return false;
return true;
}

// wird von der LineEdit abgeleiteten Klasse aufgerufen über Key-pressed ... in command steht dann der zu sendende Text
void Form1::sendCommand()
{
if (fd==-1)
return;
if(lineEdit->command() == "!ctrl_c") sendByte(3);
else if(lineEdit->command() == "!ctrl_q") sendByte(17);
else if(lineEdit->command() == "!ctrl_s") sendByte(19);
else sendString(lineEdit->command());
}

anda_skoa
01-11-2004, 21:52
So nun meine eigentliche Frage :
Kann es durch zu viele Signal-Slot-Verbindungen dazu kommen, dass das Programm die Abarbeitung nicht mehr schafft und dann manche Calls einfach auslässt !?

Inwiefern Calls?



Weil in meinem richtigen Programm sind doch durch das Menü schon sehr viele Signal-Slot (~20) und bei meinem Test-Programm sind es dann grade 2

Das ist keine nennenswerte Größenordnung, in meinen Applikationen hab ich oft wesentlich mehr als 100 Connections,

Nur um sicher zu gehen, dass die Zeichen nicht in der Darstellung verloren gehen, könntest du sie direkt nach Erhalt mal zusätzlich auf der Konsole ausgeben.

Ciao,
_