Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рабочий поток и CTypedPtrList 
V
    Опции темы
nikitos1980
Дата 4.5.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Добрый день
Логика программы такова: в классе  окна хрантся экземпляр объекта - список, допустим, m_List (тип CatalogList, определенный как typedef CTypedPtrList<CPtrList, CProducer*> CatalogList, где CProducer - объект, производный от CObject).
Я запускаю поток, в котором из базы собираются данные и добавляются в список m_List. Добавление произвожу, создавая указатель на объект CProducer.
Все удачно производится и список заполняется.
Однако, когда поток завершается список оказывается очищенным! 
m_List.GetCount() == 0

Подскажите пожалуйста, почему удаляются элементы по завершению потока?

Спасибо
PM MAIL WWW   Вверх
Earnest
Дата 5.5.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Без кода ничего сказать нельзя. Однако, чудес не бывает.  Либо кто-то твой список очищает, либо ты заполняешь не тот экземпляр. Проверь адрес объекта в потоке и вне его. Если список хранится в окне, то возможно, ты работаешь с разными инстансами объекта-окна.


--------------------
...
PM   Вверх
nikitos1980
Дата 5.5.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Действительно, адреса разные. Я передавал в поток патаметр HWND - описатель окна, а в потоке создавал экземпляр окна и "прикреплял" описатель CView->Attach(hWnd);
теперь передал указатель на окно вида в поток и адреса одинаковые.

Earnest, скажи пожалуйста, можно ли передавать в параметр в вызов потока указатель на окно (this)? Я слышал мнение, что указатели опасно передавать, а следует обходиться только описателем в данном случае. Если же использовать описатель HWND, то как получить указатель на окно по описателю?

Спасибо

Это сообщение отредактировал(а) nikitos1980 - 5.5.2009, 10:20
PM MAIL WWW   Вверх
voov
Дата 5.5.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Цитата(nikitos1980 @  5.5.2009,  10:18 Найти цитируемый пост)
Если же использовать описатель HWND, то как получить указатель на окно по описателю

Код

(CWnd*) CWnd::FromHandle(hwnd);

PM MAIL   Вверх
Earnest
Дата 5.5.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Нет, нет. Тогда экземпляры будут разные. Что и получилось у nikitos1980. Это потому, что каждый поток свою карту HWND->CWnd* поддерживает.
Передавать CWnd* небезопасно, но можно. Вопрос в том, что у него вызывать. Не все функции окна можно вызывать в чужом потоке. Но с данными работать вполне можно. Лучше, конечно, передать сразу данные, этот самый список.


--------------------
...
PM   Вверх
voov
Дата 5.5.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Цитата(Earnest @  5.5.2009,  16:34 Найти цитируемый пост)
Нет, нет. Тогда экземпляры будут разные. Что и получилось у nikitos1980

ой, да, сори. не полностью проникся ситуацией.
конечно же код CWnd::FromHandle(hwnd); создаст свой экземпляр класса окна
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.