Название: Сигналы и массив Отправлено: serg_hd от Декабрь 01, 2009, 17:56 Вопрос ко всем знающим - можно ли сигналы "загнать" в массив, именно какой-либо qt-массив (или коллекцию и т.п.) не средствами с++ (ну можно и с++, я уже прикину аналог на java если возможно будет). Вобщем куда-нибудь, но чтобы потом из другого класса можно было указать слот на каждый из этих элементов-сигналов массива. Собсна закидывать в массив уже могу:
Код: ArrayList signals = new ArrayList(); Код: Signal<Integer> x = signals.get(0); Название: Re: Сигналы и массив Отправлено: spectre71 от Декабрь 01, 2009, 18:36 Вопрос ко всем знающим - можно ли сигналы "загнать" в массив, именно какой-либо qt-массив (или коллекцию и т.п.) не средствами с++ (ну можно и с++, я уже прикину аналог на java если возможно будет). Вобщем куда-нибудь, но чтобы потом из другого класса можно было указать слот на каждый из этих элементов-сигналов массива. Собсна закидывать в массив уже могу: Код: ArrayList signals = new ArrayList(); Код: Signal<Integer> x = signals.get(0); Не вижу смысла в таком массиве. Советую изменить архитектуру. Опиши задачу, для чего тебе потребовался такой массив. Название: 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()'ы также сработают, прогрессия получится. Поэтому испускать нужно конкретный сигнал для конкретного потока... про это я не понялНазвание: 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 это тоже предоставит? Название: Re: Сигналы и массив Отправлено: spectre71 от Декабрь 03, 2009, 12:38 - Вызывает непосредственно thr->SetData для отправки данных второстепенному потоку А что, можно отослать сигнал конкретному второстепенному потоку (пусть даже имея его как сендера)? Как?Причем здесь сигнал? Непосредственный вызов thr->SetData(MyData) из главного потока Название: Re: Сигналы и массив Отправлено: Igors от Декабрь 03, 2009, 13:01 А можно какой-нибудь простейший пример? Ни разу не работал с QEvent Сигналы между нитками все равно сводятся к postEvent, т.е. он-то и предоставляет. ПсевдокодА сигналы нужны для связи между разными потоками, QEvent это тоже предоставит? Код: class MyEvent : public QCustomEvent { В вызывающей нитке Код: MyEvent * evt = new MyEvent(); В нитке-получателе Код: void MyReceiver::customEvent( QEvent * event ) Название: Re: Сигналы и массив Отправлено: BRE от Декабрь 03, 2009, 13:05 Код: void MyReceiver::customEvent( QEvent * event ) Название: Re: Сигналы и массив Отправлено: Igors от Декабрь 03, 2009, 13:08 Код: void MyReceiver::customEvent( QEvent * event ) Название: 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 для отправки данных второстепенному потоку Сделал. Всё так, но в методе (слоте) главного потока, который создаёт форму приложения: Код: //отправитель сигнала Название: 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 Твоя схема - основана на твоей изначальной идее. У меня, насколько я понял, так и работает. Разве что QWaitCondition не применял, а надо ли.Ты посмотрел ссылку? http://www.prog.org.ru/topic_10041_0.html (http://www.prog.org.ru/topic_10041_0.html) Она решает твою проблему! Название: 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() :) А если по существу, то я что-то не понимаю в чем проблема на данный момент ??? Еще с первого поста, решение было очевидно. В разделе ГУИ( http://www.prog.org.ru/topic_11481_0.html ) я описал и реализовал подобный алгоритм. И все работает. Чем эта задача радикально отличается от той? - да ни чем! Просто дополнительные потоки в которых крутиться сам алгоритм сценария. ВСЁ! И еще мне не понятно, зачем для каждого перехода по ссылке, заново создавать WebView? У него же есть метод load(url), который собственно говоря для этого и предназначен. Еще есть мнение, что вопрос на столько прост, что разум отказывается поверить в то, что могут существовать такие вопросы. Ну не будем отвлекаться и оффтопить ;) Название: Re: Сигналы и массив Отправлено: spectre71 от Декабрь 04, 2009, 08:50 Твоя схема - основана на твоей изначальной идее. У меня, насколько я понял, так и работает. Разве что QWaitCondition не применял, а надо ли.Ты посмотрел ссылку? http://www.prog.org.ru/topic_10041_0.html (http://www.prog.org.ru/topic_10041_0.html) Она решает твою проблему! Если у тебя нет 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 (в инете решения так и не встретил):
Код Надеюсь, его load() асинхронен и QWebPage ведёт себя как и QWebView - прорисовывает js, html и т.п. |