powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / про указатели и потоки
20 сообщений из 20, страница 1 из 1
про указатели и потоки
    #34002330
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть SDI приложение (CApp), которое при запуске в OnInitInstance() создает экземпляр диалогового окна (CDlg) и запускает его через DoModal. Диалог, в свою очередь, создает дополнительный поток, который, в зависимости от ситуации, должен обработать производный от класса CDaoDatabase объект.
Что я делаю:
1. В header’e CApp объявляю public указатель CDaoDatabase* m_pDB
2. В header’e CDlg объявляю public указатель CDaoDatabase* pDB
3. В OnInitInstance CApp’a создаю новый объект m_pDB = new CDaoDatabase;
передаю указатель диалогу и запускаю его
dlg.pDB = m_pDB;
dlg.DoModal();
4. В CDlg’е в OnInitDialog запускаю поток и передаю ему хендл диалога.
5. В потоке получаю через переданный хендл указатель на диалог и проверяю указатель на CDaoDatabase.

Что получается:
1. Если поставить брекпоинты на моменте передачи диплогу указателя и моменте проверки указателя в созданном потоке, то значения этих указателей разные, а точнее: в первом случае все ОК, а в потоке он ссылается на какую-то неинициализированную область памяти, в общем, в никуда.
2. Последовательность действий проверена, все идет так как и описано выше.
3. Если в OnInitDialog проверить указатель, то он будет корректным

В общем где-то я туплю, а может и не я, но без помощи точно будут плыть говном три года, поэтому HELP ME PLEASE!

Спасибищо!
--------------------------------------------------------------
...
Рейтинг: 0 / 0
про указатели и потоки
    #34003720
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторполучаю через переданный хендл указатель на диалогчерез хендл - указатель??? Имхо, не должно работать. Какой конкретно функцией ты этот указатель получаешь?
...
Рейтинг: 0 / 0
про указатели и потоки
    #34004568
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo авторполучаю через переданный хендл указатель на диалогчерез хендл - указатель??? Имхо, не должно работать. Какой конкретно функцией ты этот указатель получаешь?
maXmo авторполучаю через переданный хендл указатель на диалогчерез хендл - указатель??? Имхо, не должно работать. Какой конкретно функцией ты этот указатель получаешь?
иожет я некорректно выразился, я имел в виду следующее:

в OnInitDialog

Код: plaintext
m_hThread = AfxBeginThread(LoadingThread, this->GetSafeHwnd());

в LoadingThread
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
UINT LoadingThread(LPVOID pParam)
{
	ASSERT(pParam != NULL);
	CDlg* pDlg = (CDlg*) CWnd::FromHandle((HWND)pParam); //здесь хендл
        ASSERT(pDlg != NULL);
	CProgressCtrl* pPrgs = (CProgressCtrl*) pDlg->GetDlgItem(IDC_LDR_PRGS);
	ASSERT(pPrgs != NULL);
	pPrgs->SetRange( 0 ,  10 ); // этот код с прогрессбаром отрабатывает отлично

// у CDlg есть public указатель на CDaoDatabase - pDBSett
//-- если его проверить до запуска потока в OnInitDialog, то по нему можно работать с CDaoDatabase
//-- однако если я попробую поставить 
pDlg->pDBSett->IsKindOf(RUNTIME_CLASS(CDaoDatabase)); // здесь брекпоинт
//то указатель pDBSett = 0xcdecdecde или типа того, проще говоря в никуда

.
.
.

        return  0 ;
}

я так же пробовал таким же образом передавать указатель на CString результат схож: эффект такой как будто юзаю неинициализированный (даже не NULL) указатель, хотя если его проверить в OnInitDilalog, то он будет корректен!!!!!
...
Рейтинг: 0 / 0
про указатели и потоки
    #34005258
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а this в OnInitDialog и pDlg в LoadingThread в одно место указывают?
валиден ли pDB после вызова AfxBeginThread?
...
Рейтинг: 0 / 0
про указатели и потоки
    #34005267
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да... и не понятно, он у тебя сидит в pDBSett или в pDB?
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007340
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoда... и не понятно, он у тебя сидит в pDBSett или в pDB?
pDB = pDBSett
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007406
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в OnInitDialog и в потоке

--------------------------------------------------------------
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007408
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--------------------------------------------------------------
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007420
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не проще ли передавать указатель на CDaoDatabase в поток непосредсвенно?
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007498
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) картинка - ужоснах
2) http://sql.ru/forum/actualthread.aspx?tid=340864#3171307
3) указатель сидит в САпп, что ты его дёргаешь туда-сюда?
4) попробуй CWnd::FromHandlePermanent
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007604
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo1) картинка - ужоснах
2) http://sql.ru/forum/actualthread.aspx?tid=340864#3171307

sorry
maXmo
указатель сидит в САпп, что ты его дёргаешь туда-сюда?
так задумано, дальше будет хлеще
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007605
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman10Не проще ли передавать указатель на CDaoDatabase в поток непосредсвенно?
каким образом?
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007609
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo4) попробуй CWnd::FromHandlePermanent
...
Рейтинг: 0 / 0
про указатели и потоки
    #34007847
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4) почитай, в чём разница между этими методами до полного просветления.
5) то, как ты пытаешься получить члены СДлг через хвнд в другом потоке - это точно неправильно.
6) передавай вместо хвнд указатель сразу на СДлг. А лучше завести отдельный контейнер для данных типа СДокумента или как там это по уму делается...

Cerebrumтак задумано, дальше будет хлещеда уже мозга на мозге.
...
Рейтинг: 0 / 0
про указатели и потоки
    #34008005
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum
4. В CDlg’е в OnInitDialog запускаю поток и передаю ему хендл диалога.
5. В потоке получаю через переданный хендл указатель на диалог и проверяю указатель на CDaoDatabase.


А почему бы не передавать потоку напрямую указатель на этот CDaoDatabase ?
Это чтобы жизнь медом не казалась ?

Cerebrum
Что получается:
1. Если поставить брекпоинты на моменте передачи диплогу указателя и моменте проверки указателя в созданном потоке, то значения этих указателей разные, а точнее: в первом случае все ОК, а в потоке он ссылается на какую-то неинициализированную область памяти, в общем, в никуда.



Если до и после передачи указатели разные, значит ты их неправильно передаешь. Надо передавать правильно.
...
Рейтинг: 0 / 0
про указатели и потоки
    #34008007
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут есть потенциальная засада. если к моменту старта дочернего потока диалог уже закроется, то объект диалога будет уничтожен и указатель на него будет невалиден.
...
Рейтинг: 0 / 0
про указатели и потоки
    #34008477
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv...

Попробую ответить сразу на все.

1. Не передаю по одной простой причине: мне нужно помимо контролирования класса CDaoDatabase, контролировать контролы на диалоге, поэтому я предпочел передать указатель на объект класса, производный от CDialog, который несет в себе указатель на объект БД.

2. Обязательно учту, про закрытие диалога раньше старта, но такого не будет, т.к. диалог при выходе контролирует завершен ли запущенный поток или нет, и в случае незавершения ждет его.
...
Рейтинг: 0 / 0
про указатели и потоки
    #34009495
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum...мне нужно помимо контролирования класса CDaoDatabase, контролировать контролы на диалоге, поэтому я предпочел передать указатель на объект класса, производный от CDialog, который несет в себе указатель на объект БД....

не забудьте только синхронизировать доступ из разных ниток к одним и тем же ресурсам (т.е. объектам в памяти)... Иначе нихрена работать не будет...

и ышо...попробуйте заюзать APIшную функцию старт апа потока (у Рихтера толково обговорено). На вскидку не помню, но у МФЦ надо поаккуратней с памятью. Вполне возможно, что пул используется другой... Тут должно влиять (если не глючу) статик-не статик библиотека. Если у Вас в проекте шаред дэлеле - попытайтесь поставить статик...


с уважением
(круглый)
...
Рейтинг: 0 / 0
про указатели и потоки
    #34010072
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Иначе нихрена работать не будет...вообще, микросакс утверждает, что будет, но репу за такое всё равно чистят.
...
Рейтинг: 0 / 0
про указатели и потоки
    #34011179
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 , maXmo спасибо за советы
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / про указатели и потоки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]