crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
512es
  опции профиля:
сообщение 31.10.2008, 12:27
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Здравствуйте!)

правильно ли я понимаю?


class NetThread : public QThread
{
    Q_OBJECT
...
private slots:
    void onReadyRead();
};

void NetThread::run()
{
    tcpSocket = new QTcpSocket;
    if (!tcpSocket->setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocket->error());
        return;
    }
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    exec();
    tcpSocket->disconnectFromHost();
    if(tcpSocket->state() != QAbstractSocket::UnconnectedState) tcpSocket->waitForDisconnected();    
}

void NetThread::onReadyRead()
{
...
}


сигнал onReadyRead будет выполнен в главном потоке, а не в том, в котором создавался сокет?
хочу чтобы сервер выделял отдельный поток на каждого клиента, т.е. каждое соединение.

если этот пример не правилен тогда как это реализовать? QCustomEvent? не совсем понимаю как его тут задействовать..
обмениваться данными между дочерними потоками мне не надо. надо только чтобы главный поток мог посылать задания дочерним а дочерние овтечали главному.. читать данные от клиентов лучше в дочернем потоке (в том где было создано соединение)
(уф.. вроде объяснил)

заранее спасибо =)

Цитата(512es @ 31.10.2008, 12:21) Link
...сигнал onReadyRead будет выполнен...

всмысле слот =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 5.11.2008, 12:24
Сообщение #12


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


в главном потоке есть листвиджет, в созданном вызывается listwidget->setenabled(false), дебаггер орет что не может послать событие объекту, которым владеет другой поток. Как разрулить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 14:09
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


дак виджеты вроде только в главном потоке создаются, может и их методы не стоит использовать в другом потоке?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 5.11.2008, 14:15
Сообщение #14


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


в билдере есть такая штука Syncronize, как раз для того чтобы методы компонентов вызывались в главном потоке, при том что по коду их вызов осуществляется в дочернем потоке, мож здесь тоже есть чтото подобное

и почему не коннектит:
RenderThread::RenderThread(QObject *parent)
: QThread(parent)
{
connect(parent, SIGNAL(started()),
this, SLOT(onStarted));
}
пишет cannot connect в output'е (MS VS)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 14:21
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kuler @ 5.11.2008, 17:15) Link
cannot connect
Хм, слишком короткая строка, обычно причину указвает, типа нет такого слота и т.п.

Цитата(kuler @ 5.11.2008, 17:15) Link
onStarted
скобки забыл
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 5.11.2008, 14:43
Сообщение #16


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Litkevich Yuriy @ 5.11.2008, 14:21) Link
скобки забыл

аааа, вернааа!


Цитата(Litkevich Yuriy @ 5.11.2008, 14:09) Link
дак виджеты вроде только в главном потоке создаются, может и их методы не стоит использовать в другом потоке?

а если сделать moveToThread для окна?

а вот так почему не катит:

class FormMain : public QMainWindow, public QThread

QThread::connect((QThread*)this, SIGNAL(QThread::started()),
(QThread*)this, SLOT(onStarted()));
no such signal started()

Сообщение отредактировал kuler - 5.11.2008, 14:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 15:20
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kuler @ 5.11.2008, 17:43) Link
(QThread*)this
а это зачем?

Цитата(kuler @ 5.11.2008, 17:43) Link
QThread::started()
Цитата(kuler @ 5.11.2008, 17:43) Link
no such signal started()
я с MOC'ом солидарен. в Link написано, что в функцию connect, в макросы помещают имена функций, без относительно класса, т.к. передаются указатели на него
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 5.11.2008, 15:27
Сообщение #18


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


можно написать так
QMainWindow::connect((QThread*)this, SIGNAL(started()),
(QMainWindow*)this, SLOT(onStarted()));
не сработает

так почему moveToThread не срабатывает? или не должен?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 15:34
Сообщение #19


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kuler @ 5.11.2008, 18:27) Link
можно написать так
QMainWindow::connect((QThread*)this, SIGNAL(started()),
(QMainWindow*)this, SLOT(onStarted()));
а чё ты извращаешся над функцией connect?

Цитата(kuler @ 5.11.2008, 17:15) Link
connect(parent, SIGNAL(started()),
this, SLOT(onStarted));
вот нормальный вариант, только скобки забыл.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 5.11.2008, 15:42
Сообщение #20


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Litkevich Yuriy @ 5.11.2008, 15:34) Link
вот нормальный вариант, только скобки забыл.

так не покатит, ибо есть два QObject (множ. наследование). ПРО moveToThread то что нить скажешь? При попытке m_QObject->moveToThread(thr); пишет Widgets cannot be moved to a new thread
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.8.2025, 19:39