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) *
...сигнал 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) *
cannot connect
Хм, слишком короткая строка, обычно причину указвает, типа нет такого слота и т.п.

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


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

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

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




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


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

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


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

а если сделать 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) *
(QThread*)this
а это зачем?

Цитата(kuler @ 5.11.2008, 17:43) *
QThread::started()
Цитата(kuler @ 5.11.2008, 17:43) *
no such signal started()
я с MOC'ом солидарен. в руководстве написано, что в функцию 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) *
можно написать так
QMainWindow::connect((QThread*)this, SIGNAL(started()),
(QMainWindow*)this, SLOT(onStarted()));
а чё ты извращаешся над функцией connect?

Цитата(kuler @ 5.11.2008, 17:15) *
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) *
вот нормальный вариант, только скобки забыл.

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

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


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




RSS Текстовая версия Сейчас: 15.1.2025, 18:04