Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Probleme QT und Signals

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.12.2002
    Beiträge
    15

    Probleme QT und Signals

    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

    Code:
    // 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());
    }
    Geändert von sebbel (29-10-2004 um 18:58 Uhr)

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von sebbel
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •