Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Декабрь 01, 2009, 17:56



Название: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 17:56
Вопрос ко всем знающим - можно ли сигналы "загнать" в массив, именно какой-либо qt-массив (или коллекцию и т.п.) не средствами с++ (ну можно и с++, я уже прикину аналог на java если возможно будет). Вобщем куда-нибудь, но чтобы потом из другого класса можно было указать слот на каждый из этих элементов-сигналов массива. Собсна закидывать в массив уже могу:
Код:
ArrayList signals = new ArrayList();
signals.add(0, new Signal1<Integer>());
Но emit() нужно вызвать без переменной посредника (т.е. не применяя например
Код:
Signal<Integer> x = signals.get(0); 
x.emit(111))
Проще говоря, мне нужно осуществить что-то наподобие signals.get(0).emit(111);


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 01, 2009, 18:36
Вопрос ко всем знающим - можно ли сигналы "загнать" в массив, именно какой-либо qt-массив (или коллекцию и т.п.) не средствами с++ (ну можно и с++, я уже прикину аналог на java если возможно будет). Вобщем куда-нибудь, но чтобы потом из другого класса можно было указать слот на каждый из этих элементов-сигналов массива. Собсна закидывать в массив уже могу:
Код:
ArrayList signals = new ArrayList();
signals.add(0, new Signal1<Integer>());
Но emit() нужно вызвать без переменной посредника (т.е. не применяя например
Код:
Signal<Integer> x = signals.get(0); 
x.emit(111))
Проще говоря, мне нужно осуществить что-то наподобие signals.get(0).emit(111);

Не вижу смысла в таком массиве.  Советую изменить архитектуру.
Опиши задачу, для чего тебе потребовался такой массив.


Название: Re: Сигналы и массив
Отправлено: lit-uriy от Декабрь 01, 2009, 18:38
почему-то мне это напомнило QSignalMaper


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 18:48
Есть основной поток и множество других. Каждый из "других" имеет свой сигнал, основной поток имеет слот, на который все сигналы второстепенных потоков будут ссылаться. Это первая часть. Другая состоит в том, что основной поток должен будет испускать сигналы так, чтобы только нужные потоки его получали.
С массивом это было бы просто - главный поток делал бы connect() только с теми сигналами, которые нужны (чтобы слоты не срабатывали по прогрессии, накопления). Ну и наоборот.

п.с. на самом деле немного упростил, у меня 3 уровня потоков: основной, второй (единственный) поток, который создаёт потоки 3го уровня, и собственно куча потоков 3го уровня которые будут слать сигналы через через 2й аж на 1й, но не в том суть.


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 18:55
почему-то мне это напомнило QSignalMaper
Много думал о вариантах и с ним тоже. Типа создам мапер в классе, который создаёт потоки 3го уровня, чтобы эти потоки в него пихать. Создам слот мапера, который будет принимать, например, номер созданного потока при каждом их испускании сигнала, а что потом делать с этим номером? С массивом сигналов было бы и проще и удобнее как-то.


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 01, 2009, 18:56
Есть основной поток и множество других. Каждый из "других" имеет свой сигнал, основной поток имеет слот, на который все сигналы второстепенных потоков будут ссылаться. Это первая часть.

Для этого можно использовать QSignalMaper - если требуется идентификация того кто послал сигнал.

Другая состоит в том, что основной поток должен будет испускать сигналы так, чтобы только нужные потоки его получали.
С массивом это было бы просто - главный поток делал бы connect() только с теми сигналами, которые нужны (чтобы слоты не срабатывали по прогрессии, накопления). Ну и наоборот.

Опиши чуть подробнее, есть предположение что ты имеешь ввиду, но не совсем уверен.


Название: Re: Сигналы и массив
Отправлено: Igors от Декабрь 01, 2009, 19:01
Сигналы между нитками все равно сводятся к postEvent - так почему бы, не мудрствуя лукаво, его и не задействовать? Получатели известны, все что надо передать - поместить в потомок QEvent и.т.д


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 19:11
Опиши чуть подробнее, есть предположение что ты имеешь ввиду, но не совсем уверен.
Не знаю как бы ещё по-подробнее...Просто не хочу приводить ява-код, только лишний раз вводить в заблуждение.
Жму на форме "старт", запускается поток, который клепает множество других (в цикле), которые испускают сигналы. Зачем это дело кинул в отдельный поток? - чтобы легко было управлять, ставить паузы, запускать заново с обнулением счётчика, не тормозила форма при этом цикле и т.п.
Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил. Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.


Название: Re: Сигналы и массив
Отправлено: lit-uriy от Декабрь 01, 2009, 19:11
>>Другая состоит в том, что основной поток должен будет испускать сигналы так,
>>чтобы только нужные потоки его получали.
Ты не говорил, что у основного потока есть сигналы, говорил, что один слот. И не говорил, что у потоков есть слоты.
Но даже если это так, то не вижу никакой причины просто сединить их в основном птоке


Название: Re: Сигналы и массив
Отправлено: lit-uriy от Декабрь 01, 2009, 19:16
Жму на форме "старт", запускается поток, который клепает множество других (в цикле), которые испускают сигналы.
в цикле же и делаешь соединение
Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил.
Объект отправитель (из потока) знаешь (через sender()) вызываешь его метод с помощью invokeMethod()
Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.
аналогично выше перечисленному


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 19:17
>>Другая состоит в том, что основной поток должен будет испускать сигналы так,
>>чтобы только нужные потоки его получали.
Ты не говорил, что у основного потока есть сигналы, говорил, что один слот. И не говорил, что у потоков есть слоты.
Но даже если это так, то не вижу никакой причины просто сединить их в основном птоке

Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 19:18
Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил.
Объект отправитель (из потока) знаешь (через sender()) вызываешь его метод с помощью invokeMethod()
Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.
аналогично выше перечисленному
этого я не знал, спасибо, попробую


Название: Re: Сигналы и массив
Отправлено: lit-uriy от Декабрь 01, 2009, 19:25
Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
про это я не понял, расскажи как ты представляешь соединение (напримере не массы потоков а одного дополнительного)


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 19:37
Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
про это я не понял, расскажи как ты представляешь соединение (напримере не массы потоков а одного дополнительного)
Я себе его пока (без массива сигналов) не представлю, иначе бы не запостил тему.
Если бы можно было сигналы пихать в массив, то:
при старте цикла в потоке, создающего потоки - создался поток :)(в который я передам i цикла и класс главного потока). Тут же, при этой же итерации присваиваю массиву mas сигнал (ну можно и в самом только что созданном потоке), делаю connect() главной формы с новоприсвоенным элементом mas. Делаю в созданном потоке коннект с главным потоком (для получения результата) и испускаю сигнал для создания главным потоком gui-объекта.


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 01, 2009, 19:39
Каждый раз, когда поток основной формы будет слать сигнал, то все ранее связанные с ним connect()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока...
про это я не понял
Если я в главной форме объявлю единственный сигнал signal, а потом в каждом из потоков буду с ним соединять, то при каждом emit() этого главного потока, все предыдущие соединения будут также реагировать


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 01, 2009, 19:46
Опиши чуть подробнее, есть предположение что ты имеешь ввиду, но не совсем уверен.
Не знаю как бы ещё по-подробнее...Просто не хочу приводить ява-код, только лишний раз вводить в заблуждение.
Жму на форме "старт", запускается поток, который клепает множество других (в цикле), которые испускают сигналы. Зачем это дело кинул в отдельный поток? - чтобы легко было управлять, ставить паузы, запускать заново с обнулением счётчика, не тормозила форма при этом цикле и т.п.
Главный поток (который отвечает за gui) принимает сигналы и создаёт gui-объекты, после создания каждого объекта шлёт такой сигнал, чтобы именно нужный поток 3го уровня его подхватил. Затем поток 3 уровня может послать на главный поток другой сигнал (если надо), главный поток ему (и только ему) ответит результатом.

Простой вариант:

1)
В объекте главного потока делаем слот на прием сообщений от второстепенных потоков
Во второстепенных  потоках делаем сигнал для отправки данных главному потоку
Для каждого потока их соединение делаем сразу после его создиния
В слоте главного потока получаем указатель второстепенного  потока через по sender()
2) Для приема данных от главного потока в классе второстепенного делаем.
- Обычный public метод который вызовет объект главного потока (SetData)
- Делаем сигнал(signalSetData) и слот(slotlSetData). Соединяем и в консструкторе потока c флагом Qt::QueuedConnection
- В методе SetData делаем "emit signalSetData" - переправляем данные самому себе
3) Как все вместе работает
- Главный поток получает сигнал от второстепенного
- По sender() получает указатель и приводит его к нужному типу (MyThread* thr = static_cast<MyThread*>(sender());)
- Делает необходимую обработку
- Вызывает непосредственно thr->SetData для отправки данных второстепенному потоку


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 02, 2009, 19:42
Реализовывал ранее подобный класс.
Оформлю, выложу на гугл-код, дам ссылку. Но класс на С++.


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 11:18
- Вызывает непосредственно thr->SetData для отправки данных второстепенному потоку
А что, можно отослать сигнал конкретному второстепенному потоку (пусть даже имея его как сендера)? Как?


Название: Re: Сигналы и массив
Отправлено: Igors от Декабрь 03, 2009, 12:13
А что, можно отослать сигнал конкретному второстепенному потоку (пусть даже имея его как сендера)? Как?
Любой потомок QObject знает нитку в которой он создан. Если Вы пошлете ему event, он будет обрабатываться в EventLoop этой нитки. Таким образом у Вас нет проблем "послать потоку", просто посылайте "объекту этого потока" и не видно зачем Вам вообще связываться с какими-то сигналами. 


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 12:29
А что, можно отослать сигнал конкретному второстепенному потоку (пусть даже имея его как сендера)? Как?
Любой потомок QObject знает нитку в которой он создан. Если Вы пошлете ему event, он будет обрабатываться в EventLoop этой нитки. Таким образом у Вас нет проблем "послать потоку", просто посылайте "объекту этого потока" и не видно зачем Вам вообще связываться с какими-то сигналами.  
А можно какой-нибудь простейший пример? Ни разу не работал с QEvent
А сигналы нужны для связи между разными потоками, QEvent это тоже предоставит?


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 03, 2009, 12:38
- Вызывает непосредственно thr->SetData для отправки данных второстепенному потоку
А что, можно отослать сигнал конкретному второстепенному потоку (пусть даже имея его как сендера)? Как?

Причем здесь сигнал?
Непосредственный вызов thr->SetData(MyData) из главного потока


Название: Re: Сигналы и массив
Отправлено: Igors от Декабрь 03, 2009, 13:01
А можно какой-нибудь простейший пример? Ни разу не работал с QEvent
А сигналы нужны для связи между разными потоками, QEvent это тоже предоставит?
Сигналы между нитками все равно сводятся к postEvent, т.е. он-то и предоставляет. Псевдокод

Код:
class MyEvent : public QCustomEvent {
public:
  ...
  int mActionID;             //  действие
  QObject * mSender;    // удобно записать посылающего
  ......                         // передаваемые данные
};

В вызывающей нитке
Код:
MyEvent * evt = new MyEvent();
evt->mActionID = ...     // заряжаем данные для передачи
evt->mSender = this;
QAppication::postEvent(theReceiver[threadIndex], evt);  // посылаем объекту нитки с индексом threadIndex

В нитке-получателе
Код:
void MyReceiver::customEvent( QEvent * event )
{
  MyEvent * evt = dynamic_cast <MyEvent *> (event);
  if (!evt) return;
  switch (evt->mActionID) {
    ....
    case ACT_1:
      ...
      postEvent(evt->mSender, reply);   // отвечаем пославшему
      break;
  }
}


Название: Re: Сигналы и массив
Отправлено: BRE от Декабрь 03, 2009, 13:05
Код:
void MyReceiver::customEvent( QEvent * event )
{
  MyEvent * evt = qobject_cast <MyEvent *> (evt);
QEvent не наследник QObject, поэтому qobject_cast работать не должен/не будет.


Название: Re: Сигналы и массив
Отправлено: Igors от Декабрь 03, 2009, 13:08
Код:
void MyReceiver::customEvent( QEvent * event )
{
  MyEvent * evt = qobject_cast <MyEvent *> (evt);
QEvent не наследник QObject, поэтому qobject_cast работать не должен/не будет.

Спасибо, поправил на dynamic_cast


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 17:14
Простой вариант:

1)
В объекте главного потока делаем слот на прием сообщений от второстепенных потоков
Во второстепенных  потоках делаем сигнал для отправки данных главному потоку
Для каждого потока их соединение делаем сразу после его создиния
В слоте главного потока получаем указатель второстепенного  потока через по sender()
2) Для приема данных от главного потока в классе второстепенного делаем.
- Обычный public метод который вызовет объект главного потока (SetData)
- Делаем сигнал(signalSetData) и слот(slotlSetData). Соединяем и в консструкторе потока c флагом Qt::QueuedConnection
- В методе SetData делаем "emit signalSetData" - переправляем данные самому себе
3) Как все вместе работает
- Главный поток получает сигнал от второстепенного
- По sender() получает указатель и приводит его к нужному типу (MyThread* thr = static_cast<MyThread*>(sender());)
- Делает необходимую обработку
- Вызывает непосредственно thr->SetData для отправки данных второстепенному потоку

Сделал. Всё так, но в методе (слоте) главного потока, который создаёт форму приложения:
Код:
       //отправитель сигнала
       ThreadCore sender = (ThreadCore)signalSender();
       wv = new QWebView();
       wv.load(new QUrl("http://site.com/")); /* на этом этапе всё равно
            ошибка "Cannot create children for a parent that is in a different thread.",
            несмотря на то, что QWebView и QUrl созданы в классе формы, т.е. главном потоке*/
       sender.setData(true);



Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 18:12
Цитировать
Всё так, но в методе(слоте) главного потока, который создаёт qwebview
а ты его вызываешь посредством сигнала, или как простой метод?


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 18:27
Сделал по аналогии с предложенным вариантом, т.е. вызывается этот слот сигналом потока, которому нужен qwebview. А этот слот делает qwebview, load(), берёт сендера и шлёт ему с помощью setData() результат о том, что загрузка страницы прошла нормально. В сендере есть другой сигнал который испускается при вызове setData(). Всё как было предложено вобщем.


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 18:39
Окончательно запутался.
Структура приложения такая?
(http://pic.ipicture.ru/uploads/091203/RgPVjNTPc5.png) (http://ipicture.ru/)

Из рабочих потоков, шлется сигнал на создание ВебВью? И рабочий поток должен получить обратно только-что созданный ВебВью?


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 18:42
Spectre всё нормально описал вроде бы...
Нарисую - выложу) Продумаю вот только чтоб по-понятнее было.


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 18:49
Цитировать
Spectre всё нормально описал вроде бы...
Тут столько всего понаписывали, что хер поймешь что из этого ТС предпочел.
Если структура приложения такая, и ответ на мой вопрос == ДА. То это реализуется за несколько минут(на с++. про яву хз). И на* вы столько понаписывали - хз. Наверное от скуки.


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 19:11
Первый вопрос: зачем определять сендера?! Сложно декларировать сигнал WorkingThread::signalCreateNewWebView(QObject*), и испускать его так "emit signalCreateNewWebView(this)" ?
Про остальное вообще говорить не хочется.


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 19:36
(http://pic.ipicture.ru/uploads/091203/qmG6UMcJyV.jpg)


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 19:42
Первый вопрос: зачем определять сендера?!
чтобы gui знал кому давать ответ


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 19:45
Цитировать
чтобы gui знал кому давать ответ
Цитировать
Сложно декларировать сигнал WorkingThread::signalCreateNewWebView(QObject*), и испускать его так "emit signalCreateNewWebView(this)" ?


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 19:47
Сложно декларировать сигнал WorkingThread::signalCreateNewWebView(QObject*), и испускать его так "emit signalCreateNewWebView(this)" ?
Ничего не понял. В любом случае, что этим способом обойдётся, что не обходится в примере выше?


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 19:53
Если структура приложения такая, и ответ на мой вопрос == ДА. То это реализуется за несколько минут(на с++. про яву хз). И на* вы столько понаписывали - хз. Наверное от скуки.
Не в том вопрос, что на каком языке сколько реализуется. Структура приложения такая как была предложена (если автор конечно чего-нибудь не упустил, но благо что изъясняться умеет). После того как понял её - реализовал минут за 5.


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 20:06
Цитировать
После того как понял её - реализовал минут за 5.
Ну наконец-то вопрос решен!


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 20:12
Если б он был решён, я бы наверно пошёл на неделю в запой. Не решён он, load() у qwebview не выполняется несмотря на то, что метод лежит в классе gui, в схеме я указал где ERROR, говорит что потоки разные.
niXman, объясни при возможности лучше насчёт "декларировать сигнал WorkingThread::signalCreateNewWebView(QObject*), и испускать его так "emit signalCreateNewWebView(this)". Декларировать где, в 3м потоке? Испускать там же? Испускание сигнала это signal.emit() - что указывать в скобках, сам поток? C каким слотом его связывать?...


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 20:23
Цитировать
Декларировать где, в 3м потоке?
да.

Цитировать
Испускать там же?
да.

Цитировать
Испускание сигнала это signal.emit()
нет. это: "emit signalCreateNewWebView(this)"

Цитировать
что указывать в скобках, сам поток?
да.

Цитировать
C каким слотом его связывать?
с тем который создает ВебВью.


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 03, 2009, 20:25
Если б он был решён, я бы наверно пошёл на неделю в запой. Не решён он, load() у qwebview не выполняется несмотря на то, что метод лежит в классе gui, в схеме я указал где ERROR, говорит что потоки разные.
niXman, объясни при возможности лучше насчёт "декларировать сигнал WorkingThread::signalCreateNewWebView(QObject*), и испускать его так "emit signalCreateNewWebView(this)". Декларировать где, в 3м потоке? Испускать там же? Испускание сигнала это signal.emit() - что указывать в скобках, сам поток? C каким слотом его связывать?...

Посмотри полностью тему:
http://www.prog.org.ru/index.php?topic=10041.msg59182#msg59182
Так будет проще.


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 20:32
с тем который создает ВебВью.
Там я по схеме тоже самое делаю, слотом его указываю, на схеме же это видно!
нет. это: "emit signalCreateNewWebView(this)"
Это сишный синтаксис? На яве я не в курсе как такое задать


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 20:32
Только что попытался прочесть всю тему заново. Опять запутался. Тупой походу.


Название: Re: Сигналы и массив
Отправлено: Igors от Декабрь 03, 2009, 20:47
Если б он был решён, я бы наверно пошёл на неделю в запой. Не решён он, load() у qwebview не выполняется несмотря на то, что метод лежит в классе gui, в схеме я указал где ERROR, говорит что потоки разные.
Правильно говорит. Ведь вы его создаете не в той нитке где gui. Вам надо:

- отправить сигнал/событие от порожденной нитки к главной

- получив его, главная нитка создает злополучный qwebview, т.е. это должно делаться при приеме, уже в главной нитке а не в посылателе


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 03, 2009, 20:51
Если б он был решён, я бы наверно пошёл на неделю в запой. Не решён он, load() у qwebview не выполняется несмотря на то, что метод лежит в классе gui, в схеме я указал где ERROR, говорит что потоки разные.
Правильно говорит. Ведь вы его создаете не в той нитке где gui. Вам надо:

- отправить сигнал/событие от порожденной нитки к главной

- получив его, главная нитка создает злополучный qwebview, т.е. это должно делаться при приеме, уже в главной нитке а не в посылателе
Ну так это само-собой! Что, вопрос в этом? И вообще, в чем вопрос?


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 20:57
- отправить сигнал/событие от порожденной нитки к главной
Люди, кто-нибудь мою схему смотрел или я зря её рисовал? Есстессно, что сигнал я шлю от порождённой к главной!
Обратите внимание, пожалуйста там на      
поток.signal1.connect (GUI, "methodSlot(Integer)");
GUI тут - это переданный в конструктор потока(который строит другие потоки) главный класс, который запускается самым первым и строит гуи. methodSlot() - это метод главного класса, который создаёт qwebview.



Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 20:59
Ну так это само-собой! Что, вопрос в этом? И вообще, в чем вопрос?
В том, что
load() у qwebview не выполняется несмотря на то, что метод лежит в классе gui, в схеме я указал где ERROR, говорит что потоки разные.


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 03, 2009, 21:08
- отправить сигнал/событие от порожденной нитки к главной
Люди, кто-нибудь мою схему смотрел или я зря её рисовал? Есстессно, что сигнал я шлю от порождённой к главной!

Я смотрел.
Твоя схема  - основана на твоей изначальной идее.
Ты посмотрел ссылку?
http://www.prog.org.ru/topic_10041_0.html (http://www.prog.org.ru/topic_10041_0.html)
Она решает твою проблему!


Название: Re: Сигналы и массив
Отправлено: Igors от Декабрь 03, 2009, 21:18
Сергей, мне кажется Вам надо выложить компилябельный упрощенный проект - а то обсуждение идет вхолостую


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 21:26
- отправить сигнал/событие от порожденной нитки к главной
Люди, кто-нибудь мою схему смотрел или я зря её рисовал? Есстессно, что сигнал я шлю от порождённой к главной!

Я смотрел.
Твоя схема  - основана на твоей изначальной идее.
Ты посмотрел ссылку?
http://www.prog.org.ru/topic_10041_0.html (http://www.prog.org.ru/topic_10041_0.html)
Она решает твою проблему!
Пока нет, завтра займусь, спасибо, а то голова болит. Но схему делал на основе вами же изложенного, что там не так? Всё как говорили, всё также.
п.с. изначальная идея вообще была - массив потоков...
На всякий случай:
Есть 3 уровня потоков: основной, второй (клепающий рабочие потоки), и третий - собственно рабочие потоки, которых может быть великое множество.
1) Программа запускается (это 1й поток, в нём же есть метод methodSlot(), который будет клепать qwebview по требованию потоков 3го уровня). Нажимаю старт, после чего запускается 2й поток, происходит создание потоков 3го уровня и тут же делаю connect одного из сигналов потока 3го уровня с methodSlot() главного потока.
2) Касаемо потока 3го уровня: в нём создаются 2 сигнала, один - для запроса к главному потоку, к его методу methodSlot(), второй работает внутри него же (зачем он опишу ниже).
3) Когда запускается поток 3го уровня, он испускает 1й сигнал методу главного потока methodSlot(), где и создаётся qwebview.
4) Внутри methodSlot(): создаётся qwebview и QUrl - тут всё нормально. Но qwebview.load(QUrl) - тут ошибка о разных потоках(!!), хотя главный класс я передавал через конструктор во 2й поток для установки connect()'a между главным потоком и потоками 3го уровня! После того как проделались нужные операции(-я) выясняю кто поток-сендер (кто запросил эти операции(-цию) у главного потока) и вызываю метод этого сендера, на схеме он называется setData().
5) Внутри setData() испускается 2й сигнал (о котором я говорил что скажу), слот у которого находится в классе этого же потока 3го уровня, тут же. На схеме этот слот называется showResult(), он просто выдаёт текст о том, что load этого потока прошёл нормально.

Не знаю просто как ещё объяснить.


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 03, 2009, 22:49
Твоя схема  - основана на твоей изначальной идее.
Ты посмотрел ссылку?
http://www.prog.org.ru/topic_10041_0.html (http://www.prog.org.ru/topic_10041_0.html)
Она решает твою проблему!
У меня, насколько я понял, так и работает. Разве что QWaitCondition  не применял, а надо ли.


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 04, 2009, 07:22
Кстати. В блоге SABROG, есть такая статейка: http://vingrad.ru/blogs/sabrog/2009/06/11/qt-45-movetothread-ili-metod-myunhgauzena/
Полагаю, ТС пригодится ;)


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 04, 2009, 08:28
Кстати. В блоге SABROG, есть такая статейка: http://vingrad.ru/blogs/sabrog/2009/06/11/qt-45-movetothread-ili-metod-myunhgauzena/
Полагаю, ТС пригодится ;)

Вот именно, niXman он явно забыл сделать moveToThread()  :)


Название: Re: Сигналы и массив
Отправлено: niXman от Декабрь 04, 2009, 08:30
Кстати. В блоге SABROG, есть такая статейка: http://vingrad.ru/blogs/sabrog/2009/06/11/qt-45-movetothread-ili-metod-myunhgauzena/
Полагаю, ТС пригодится ;)

Вот именно, niXman он явно забыл сделать moveToThread()  :)
или сделал fork()...безвозвратно ;D

А если по существу, то я что-то не понимаю в чем проблема на данный момент ???
Еще с первого поста, решение было очевидно. В разделе ГУИ( http://www.prog.org.ru/topic_11481_0.html ) я описал и реализовал подобный алгоритм. И все работает. Чем эта задача радикально отличается от той? - да ни чем! Просто дополнительные потоки в которых крутиться сам алгоритм сценария. ВСЁ! И еще мне не понятно, зачем для каждого перехода по ссылке, заново создавать WebView? У него же есть метод load(url), который собственно говоря для этого и предназначен.
Еще есть мнение, что вопрос на столько прост, что разум отказывается поверить в то, что могут существовать такие вопросы. Ну не будем отвлекаться и оффтопить ;)


Название: Re: Сигналы и массив
Отправлено: spectre71 от Декабрь 04, 2009, 08:50
Твоя схема  - основана на твоей изначальной идее.
Ты посмотрел ссылку?
http://www.prog.org.ru/topic_10041_0.html (http://www.prog.org.ru/topic_10041_0.html)
Она решает твою проблему!
У меня, насколько я понял, так и работает. Разве что QWaitCondition  не применял, а надо ли.

Если у тебя нет QWaitCondition, то так как сделано у меня работать не может.
Когда хорош описанный метод:
В случае когда требуется именно синхронизация с главным потоком. Therad вызывает метод в контексте главного потока и ожидает его завершения.  Как раз то что тебе нужно. Не нужно посылать данные главному потоку, а потом крутиться вхолостую и ждать ответа, можно сразу выполнить нужный метод в контексте главного потока и по его завершению продолжить обработку в Therad.

Чем хорош описанный метод:
- не требует запуска exec для организации цикла сообщений
- не требуется дополнительная межпотоковая синхронизация обращения к предаваемым/принимаемым данным во время исполнения синхронизованного метода.





Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 04, 2009, 12:06
Вот именно, niXman он явно забыл сделать moveToThread()  :)
Об этом ни слова не говорилось до этого.
Всё равно народ не понял в чём проблема. Повторюсь в 3(или 4?) раз: Не работает метод load() в главном потоке, никуда мне этот qwebview передавать не надо! На схеме я отсылаю в 3й поток значение bool!!!


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 04, 2009, 14:53
как оказалось, в qt этот принцип работает, в jambi нет


Название: Re: Сигналы и массив
Отправлено: serg_hd от Декабрь 04, 2009, 22:10
Гемор позади. Проблема была решена тем, что в главном потоке использовал QWebPage + везде ConnectionType.QueuedConnection (в инете решения так и не встретил):
Код
Java
 QWebPage page = new QWebPage();
 page.currentFrame().load(new QUrl("http://google.com/"));
 
Надеюсь, его load() асинхронен и QWebPage ведёт себя как и QWebView - прорисовывает js, html и т.п.