Tomcat является, прежде всего, сервером приложений, который служит запросам сделанным на заказ сервлетам Java или файлам JSP на Вашем сервере. Это обычно используется в сочетании с Apache сервер HTTP (по крайней мере, по моему опыту). Используйте его для ручной обработки входящих запросов.
сервер HTTP, отдельно, является лучшим для того, чтобы подать статическое содержание... файлы HTML, изображения, и т.д.
В дополнение к ответу 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();
}
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)
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
в время отправки (вместо сходства отправителя и получателя во время соединения).
Я не думаю, что вам разрешено напрямую вызывать вещи, которые приводят к событиям рисования из любого другие потоки, кроме основного потока. Это приведет к сбою.
Я думаю, вы можете использовать цикл обработки событий для асинхронного вызова вещей, чтобы основной поток графического интерфейса выполнял обновление из основного потока, что предлагает cjhuitt.
Что, если наша привязка к потоку говорит GUI, но мы не находимся ни в потоке GUI, ни в QThread?
Я имею в виду, что поток, не связанный с Qt (уведомление), вызывает метод интерфейса QObject, в котором мы испускаем сигнал AutoConnected. Сходство потока для QObject - это главный поток, но процедура фактически вызывается из другого потока. Что здесь делает Qt?