crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QThread && QProcess
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 1.1.2010, 17:39
  где-то на форуме уже было про это. На пямять не помню.

по моему, это связано с тем, что ты не запустил цикл обработки событий потока.
Т.е. вместо бесконечного цикла FOR, нужно написать exec()

Нашёл
DEADHUNT Дата 1.1.2010, 16:03
 
class Worker : public QThread
{
    Q_OBJECT
public:
    Worker() {}

protected:
    void run()
    {
        qDebug() << "new thread id " << QThread::currentThreadId();
        for (;; )
        {
        }
    }

public slots:
    void doWork()
    {
        qDebug() << "executing thread id - " << QThread::currentThreadId();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "main thread id - " << QThread::currentThreadId();

    Worker worker;
    worker.start();

    QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);

    return a.exec();
}

почему doWork выполняется в главном треде и как можно сделать чтобы слот обрабатывался в треде Worker?
Litkevich Yuriy Дата 29.12.2009, 0:13
 
Цитата(DEADHUNT @ 29.12.2009, 0:57) *
QRunnable лучше QThread?
ничем не лучше, просто у них назначение разное:
QThread - платформо-независимый поток.

насчёт QRunnable ошибся. Смотри
QtConcurrent::run - Runs function in a separate thread
DEADHUNT Дата 28.12.2009, 21:57
 
Цитата(Litkevich Yuriy @ 28.12.2009, 21:08) *
Если нужно сделать именно метод в отдельном потоке смотри QtConcurent (QrRunable)

а чем QRunnable лучше QThread? его даже остановить нельзя.
Litkevich Yuriy Дата 28.12.2009, 21:08
 
Цитата(DEADHUNT @ 29.12.2009, 0:03) *
someClass->gdbProcess.canReadLine()
у тебя получается, что в StreamReader ты вызываешь метод пренадлежащий классу из другого потока.

Если нужно сделать именно метод в отдельном потоке смотри QtConcurent (QrRunable)
DEADHUNT Дата 28.12.2009, 21:03
 
class StreamReader : public QThread {
        SomeClass *someClass;
    protected:
        void run()
        {
            for (;; )
            {
                while (!someClass->process.canReadLine())
                    QThread::yieldCurrentThread();
                QString str = QString(someClass->process.readLine());
                qDebug() << "read stdout" << str;
             }
        }
    public:
        StreamReader(SomeClass *someClass);
};

class SomeClass {

StreamReader streamReader; // создаётся в конструкторе передаётся this

QProcess process;

void some_method()
{
    process.start(...);
    process.waitForStarted(INT_MAX);
    streamReader.start(); // Thread

    for (;; ) /* QApplication::processEvents() */;
};

если расскоментировать processEvents то сообщения от программы выводятся, а если нет то StreamReader ничего не считыват. в чём может быть проблема?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 13:29