![]() |
|
|
![]()
|
|
| nikitos1980 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 17.5.2008 Репутация: нет Всего: нет |
Добрый день
Логика программы такова: в классе окна хрантся экземпляр объекта - список, допустим, m_List (тип CatalogList, определенный как typedef CTypedPtrList<CPtrList, CProducer*> CatalogList, где CProducer - объект, производный от CObject). Я запускаю поток, в котором из базы собираются данные и добавляются в список m_List. Добавление произвожу, создавая указатель на объект CProducer. Все удачно производится и список заполняется. Однако, когда поток завершается список оказывается очищенным! m_List.GetCount() == 0 Подскажите пожалуйста, почему удаляются элементы по завершению потока? Спасибо |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Без кода ничего сказать нельзя. Однако, чудес не бывает. Либо кто-то твой список очищает, либо ты заполняешь не тот экземпляр. Проверь адрес объекта в потоке и вне его. Если список хранится в окне, то возможно, ты работаешь с разными инстансами объекта-окна.
-------------------- ... |
|||
|
||||
| nikitos1980 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 17.5.2008 Репутация: нет Всего: нет |
Действительно, адреса разные. Я передавал в поток патаметр HWND - описатель окна, а в потоке создавал экземпляр окна и "прикреплял" описатель CView->Attach(hWnd);
теперь передал указатель на окно вида в поток и адреса одинаковые. Earnest, скажи пожалуйста, можно ли передавать в параметр в вызов потока указатель на окно (this)? Я слышал мнение, что указатели опасно передавать, а следует обходиться только описателем в данном случае. Если же использовать описатель HWND, то как получить указатель на окно по описателю? Спасибо Это сообщение отредактировал(а) nikitos1980 - 5.5.2009, 10:20 |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Нет, нет. Тогда экземпляры будут разные. Что и получилось у nikitos1980. Это потому, что каждый поток свою карту HWND->CWnd* поддерживает.
Передавать CWnd* небезопасно, но можно. Вопрос в том, что у него вызывать. Не все функции окна можно вызывать в чужом потоке. Но с данными работать вполне можно. Лучше, конечно, передать сразу данные, этот самый список. -------------------- ... |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |