Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Передвать из одного потока в другой поток данные н |
Автор: 2faust 9.7.2009, 16:09 | ||||||
все привет. тут столкнулся с маленькой проблеммой. когда передаю данные на форму, дальше при появлении формы выскакивает ошибка. проблема наверное заклячается в том, что не передаю адресс родителя в форму. а как надо правильно сделать? если данные на форму не передавать форма появляется без всяких проблем. вот пример :
|
Автор: Earnest 10.7.2009, 07:17 |
Что-то я не заметила, что ты что-то передаешь... скорее сообщаешь о заполнении глобальной переменной, так что ли? Вот так делать нехорошо: объекты CWnd валидны только в создающем их потоке. Часть функций может ругаться ассертами. Опять же, первая функция и последняя являются обработчиками одного и того же класса-окна. Поэтому по-любому выполняются в одном потоке. Где тут передача из потока в поток? Еще, поток ты создаешь рабочий, но пытаешься создать в нем окно и запустить модальный цикл. Тоже неправильно. Ты описал бы постановку задачи, чтобы можно было конкретно советовать. |
Автор: 2faust 13.7.2009, 14:06 | ||
добрый. дело в том что у меня есть основные потоки и рабочие потоки. в основном потоке запускаю ф-цию CX::OnButton1(), та в свою очередь запускает рабочий поток ::AfxBeginThread(InitDialog, ...) смысл которого явл-ся передать форму в отдельную нить. дальше в эту нить мне надо передавать данные из основного потока ч\з ф-цию CX::OnMessageTransferData(), в которой формирую данные. в основном потоке диалог. модальн. окно не могу запускать так же как и использов. ф-цию CX::OnMessageTransferData() их работу будет блокировать waitforsingleobject в основном потоке.
с этим я конечно переборщил. был не прав. пытаюсь передать сообщение с основоной же поток. |
Автор: Earnest 14.7.2009, 07:01 |
Еще раз повторю: окна нормально работают только в специальный потоках (не помню название) но никак не в рабочих! Поток с окном должен иметь цикл обработки сообщений... Можно, конечно, попробавать запустить в рабочем потоке модальный цикл, но это какой-то ущербный вариант. Хочешь окно в отдельном потоке - создавай правильный поток. |
Автор: 2faust 14.7.2009, 08:44 |
2 Earnest я буду вам очень благодарен за помощь если вы приведете отдельный пример, как реализовать для отдельного окна в рабочем потоке цикл обработки сообщений. за неимением опыта не знаю как это реализовать. ![]() |
Автор: Earnest 14.7.2009, 16:46 |
В рабочем потоке нельзя реализовать цикл обработки сообщений, на то он и рабочий, т.е. управляется однй процедурой. UI-поток тоже запускается функцией AfxBeginThread, но ее вторым вариантом - где первым параметром стоит CRuntimeClass*. Предполагается, что это класс объекта производного от CWinThread, в котором и критится цикл обработки сообщений. Примера под рукой нет. Почитай в MSDN статью "Multithreading: Creating User-Interface Threads". |