. А>Позже, погуглив, наткнулся на статью, в которой сказано, что так делать вообще нельзя и нужно посылать сообщение основному потоку, чтобы он уже обратился к виджету.
Именно так.
A>Пробовал использовать привязку к другому потоку нужного мне виджета (moveToThread) — не помогло ни капли. Вот поэтому и задаю такой вопрос: ребят, как можно обратиться к виджету из неосновного потока, при использовании Qt4?
А вот так не надо. Весь GUI должен жить в главном потоке.
Если надо что-то дернуть -- коннектишься к слоту объекта в главном потоке как QueuedConnection и посылаешь сигнал.
Ну или PostEvent и в ответ на событие в главном потоке что-то делать.
Qt4, многопоточные приложения.
От:
Аноним
Дата:
15.08.08 09:19
Оценка:
Добрый всем день.
Занимаюсь тут портированием приложения (своего) из под linux'а под винду. Графическая часть была писана на Qt3. Поскольку под виндой распространяется бесплатной только 4-ая версия этой "великолепной" )) библиотеки пришлось переписать все под Qt4. Но вопрос не в этом. У меня в приложении используются потоки, которым необходимо обращаться к виджетам основного окна. К сожалению, это почему-то не работает — приложение вылетает при обращении к виджету из неосновного потока. Позже, погуглив, наткнулся на статью, в которой сказано, что так делать вообще нельзя и нужно посылать сообщение основному потоку, чтобы он уже обратился к виджету. Правда статья была о Qt3 под линуксом — а у меня под линуксом на Qt3 все преотлично работало. Пробовал использовать привязку к другому потоку нужного мне виджета (moveToThread) — не помогло ни капли. Вот поэтому и задаю такой вопрос: ребят, как можно обратиться к виджету из неосновного потока, при использовании Qt4?
Заранее спасибо.
21.01.10 12:21: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re[2]: Qt4, многопоточные приложения.
От:
Аноним
Дата:
15.08.08 19:29
Оценка:
Спасибо за наводку — все заработало.
Чтобы не создавать новую тему, спрошу здесь вот еще что:
можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо за наводку — все заработало. А>Чтобы не создавать новую тему, спрошу здесь вот еще что: А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
А кто мешает по завершению потока с него самого послать сообщение в главный поток? как это сделать, уже писалось выше. Правда поток может упасть не по своей воле, а умереть от несчасного случая — надо отдельно обработать.
Здравствуйте, Аноним, Вы писали:
А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
Есть функция MsgWaitForMultipleObjects, которая умеет ждать сразу и событие и оконное сообщение, что из них придет раньше.
А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
Либо самому сигнал слать, либо потоки кутешные юзать. А почему не юзаешь, если не секрет?
Здравствуйте, Аноним, Вы писали:
А>Чтобы не создавать новую тему, спрошу здесь вот еще что: А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
Цитирую Qt Assistant:
void QThread::terminated () [signal]
This signal is emitted when the thread is terminated.
void QThread::finished () [signal]
This signal is emitted when the thread has finished executing.
Патроны кончаются... Санитары близко... Всем пока!