QT +, Как назвать слот из пользовательского кода C++, работающего в другом потоке

Tomcat является, прежде всего, сервером приложений, который служит запросам сделанным на заказ сервлетам Java или файлам JSP на Вашем сервере. Это обычно используется в сочетании с Apache сервер HTTP (по крайней мере, по моему опыту). Используйте его для ручной обработки входящих запросов.

сервер HTTP, отдельно, является лучшим для того, чтобы подать статическое содержание... файлы HTML, изображения, и т.д.

13
задан HostileFork 7 January 2010 в 22:41
поделиться

5 ответов

В дополнение к ответу stribika мне часто легче использовать соединение сигнал / слот. Вы можете указать, что это должно быть соединение в очереди при его подключении, чтобы избежать проблем с сигналами потока, находящимися в контексте его объекта-владельца.

class mythread : public QThread
{
signals:
    void appendText( QString );
public:

    mythread(mywindow* win){this->w = win;};
    mywindow* w;
    void run()
    {
        emit ( appendText( "Hello" ) );
    };
};

int main(int argc, char *argv[])
{
    QApplication* a = new QApplication(argc, argv);
    mywindow* w = new mywindow();

    w->show();
    mythread* thr = new mythread(w);
    (void)connect( thr, SIGNAL( appendText( QString ) ),
                   w->ui.textEdit, SLOT( append( QString ) ),
                   Qt::QueuedConnection ); // <-- This option is important!
    thr->start();

    return a->exec();
}
8
ответ дан 1 December 2019 в 19:31
поделиться

You need to use QMetaObject::invokeMethod. For example:

void MyThread::run() {
    QMetaObject::invokeMethod(label, SLOT(setText(const QString &)), Q_ARG(QString, "Hello"));
}

(The above code comes from here: http://www.qtforum.org/article/26801/qt4-threads-and-widgets.html)

6
ответ дан 1 December 2019 в 19:31
поделиться

stribika понял это почти правильно:

QMetaObject::invokeMethod( textEdit, "append", Qt::QueuedConnection,
                           Q_ARG( QString, myString ) );

cjhuitt прав, однако: вы обычно хотите объявить сигнал в потоке и подключить его к слоту append () , получить управление временем жизни объекта бесплатно (ну, ценой незначительного изменения интерфейса). Кстати, дополнительный аргумент:

               Qt::QueuedConnection ); // <-- This option is important!

из ответа cjhuitt больше не нужен (он был в Qt <= 4.1), поскольку connect () по умолчанию имеет значение Qt :: AutoConnection , который теперь (Qt> = 4.2) делает правильные вещи и переключается между режимом прямого и очередного подключения на основе QThread :: currentThread () и сходства потоков получателя QObject в время отправки (вместо сходства отправителя и получателя во время соединения).

17
ответ дан 1 December 2019 в 19:31
поделиться

Я не думаю, что вам разрешено напрямую вызывать вещи, которые приводят к событиям рисования из любого другие потоки, кроме основного потока. Это приведет к сбою.

Я думаю, вы можете использовать цикл обработки событий для асинхронного вызова вещей, чтобы основной поток графического интерфейса выполнял обновление из основного потока, что предлагает cjhuitt.

2
ответ дан 1 December 2019 в 19:31
поделиться

Что, если наша привязка к потоку говорит GUI, но мы не находимся ни в потоке GUI, ни в QThread?

Я имею в виду, что поток, не связанный с Qt (уведомление), вызывает метод интерфейса QObject, в котором мы испускаем сигнал AutoConnected. Сходство потока для QObject - это главный поток, но процедура фактически вызывается из другого потока. Что здесь делает Qt?

2
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: