Qt4, многопоточные приложения.
От: Аноним  
Дата: 15.08.08 09:19
Оценка:
Добрый всем день.
Занимаюсь тут портированием приложения (своего) из под linux'а под винду. Графическая часть была писана на Qt3. Поскольку под виндой распространяется бесплатной только 4-ая версия этой "великолепной" )) библиотеки пришлось переписать все под Qt4. Но вопрос не в этом. У меня в приложении используются потоки, которым необходимо обращаться к виджетам основного окна. К сожалению, это почему-то не работает — приложение вылетает при обращении к виджету из неосновного потока. Позже, погуглив, наткнулся на статью, в которой сказано, что так делать вообще нельзя и нужно посылать сообщение основному потоку, чтобы он уже обратился к виджету. Правда статья была о Qt3 под линуксом — а у меня под линуксом на Qt3 все преотлично работало. Пробовал использовать привязку к другому потоку нужного мне виджета (moveToThread) — не помогло ни капли. Вот поэтому и задаю такой вопрос: ребят, как можно обратиться к виджету из неосновного потока, при использовании Qt4?
Заранее спасибо.

21.01.10 12:21: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Qt4, многопоточные приложения.
От: K13 http://akvis.com
Дата: 15.08.08 12:03
Оценка: +1
.
А>Позже, погуглив, наткнулся на статью, в которой сказано, что так делать вообще нельзя и нужно посылать сообщение основному потоку, чтобы он уже обратился к виджету.

Именно так.

A>Пробовал использовать привязку к другому потоку нужного мне виджета (moveToThread) — не помогло ни капли. Вот поэтому и задаю такой вопрос: ребят, как можно обратиться к виджету из неосновного потока, при использовании Qt4?


А вот так не надо. Весь GUI должен жить в главном потоке.
Если надо что-то дернуть -- коннектишься к слоту объекта в главном потоке как QueuedConnection и посылаешь сигнал.

Ну или PostEvent и в ответ на событие в главном потоке что-то делать.
Re[2]: Qt4, многопоточные приложения.
От: Аноним  
Дата: 15.08.08 19:29
Оценка:
Спасибо за наводку — все заработало.
Чтобы не создавать новую тему, спрошу здесь вот еще что:
можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
Re[3]: Qt4, многопоточные приложения.
От: OdesitVadim Украина  
Дата: 15.08.08 22:16
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Спасибо за наводку — все заработало.

А>Чтобы не создавать новую тему, спрошу здесь вот еще что:
А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,
А кто мешает по завершению потока с него самого послать сообщение в главный поток? как это сделать, уже писалось выше. Правда поток может упасть не по своей воле, а умереть от несчасного случая — надо отдельно обработать.
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[3]: Qt4, многопоточные приложения.
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.08.08 00:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,


Есть функция MsgWaitForMultipleObjects, которая умеет ждать сразу и событие и оконное сообщение, что из них придет раньше.
Re[3]: Qt4, многопоточные приложения.
От: gryz  
Дата: 18.08.08 13:58
Оценка:
Здравствуйте, Аноним, Вы писали:


А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по WaitForSingleObject'у основное окно не перерисовывается, что не есть гуд ). Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,


Либо самому сигнал слать, либо потоки кутешные юзать. А почему не юзаешь, если не секрет?
Re[3]: Qt4, многопоточные приложения.
От: DarkAurel Украина http://dark-aurel.livejournal.com
Дата: 19.08.08 07:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Чтобы не создавать новую тему, спрошу здесь вот еще что:

А>можно ли каким-нибудь образом поставить колбек на завершение потока, а то при ожидании по 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.

Патроны кончаются... Санитары близко... Всем пока!
Re[3]: Qt4, многопоточные приложения.
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 19.08.08 14:34
Оценка:
Здравствуйте, Аноним, Вы писали:

>> Работу с потоками я пишу на чистом АПИ, а не на Qt'шном,


почему?
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.