Qt - Wątek i funkcja read = blokowanie aplikacji

0

Witam,

Problem jaki mam to nic poważnego, bardziej chodzi o estetykę jego działania ;)
W wątku mam odczyt strumienia z "konsoli"(stdin), odebrane dane są konwertowane na inny typ i przekazane do głównego programu:

void Receiver::run(){
    int len;
    char * sample = (char*)malloc(SAMPLE_LEN*sizeof(char));
    int * isample = (int*)malloc(SAMPLE_LEN*sizeof(int));
    int i;
    for(;;){
        if((len=read(fileno(stdin), sample, SAMPLE_LEN*sizeof(char)))==0){
            usleep(1000);
            continue;
        }
        len /= sizeof(char);
        for(i=0; i<len; i++)
            isample[i] = sample[i];
        this->sampleEvent(isample, len);
        if(len<SAMPLE_LEN) usleep(1000*50);
    }
    fprintf(stderr, "thread exit\n");
}

Problem pojawia się gdy chcę wyłączyć aplikacje: "QThread: Destroyed while thread is still running"
Pomyślałem wpierw że można jakiś mądry warunek zrobić w pętli, jednak to nie wszystko... Całość blokuje mi funkcja "read" wtedy, gdy przez jakiś okres czasu nie ma danych które wysyłane są do tego programu - funkcja read czeka na jakiekolwiek pojawienie się danych inaczej "pętla" jest zablokowana. Jak taki problem rozwiązać?

0

Totalnie to źle napisałeś.
Unikaj wątków jeśli to możliwe, bo łatwo zrobić przy nich irytujące błedy, zwłaszcza jak się zaczyna programować.
Jeśli już używasz Qt to rób to na całego, zapomnij o standardowcyh bibliotekach c++!
Owiele bezpieczniej i wygodniej jest użyć QFile i sygnału readyRead.
Sygnały i sloty twoimi przyjaciółmi! Zwłaszcza podczas wielowątkowości.
Jeśli już używasz QThread to nie dziedzicz po nim, ale twórz QObjecty ze sygnałami i slotami i przenoś je do odpowiedniego wątku (moveToThread).

class ConsoleReader : public QObject {
    Q_OBJECT

    QFile *console;
public:
    ConsoleReader(QObject parent = 0) : QObject (parent) {
         console = new QFile(this);
         bool ok = console->open(stdin, QIODevice::ReadOnly);
         Q_ASSERT(ok);
         connect(console , SIGNAL(readyRead()),
                this, SLOT(readReadyData()))
    }

    ~ConsoleReader() {
          console->close();
     }

public slots:
    void readReadyData() {
         QByteArray data = console->readAll();
         // twój kod do przetwarzania danych
    }
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1