|
|
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
Есть 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! Спасибищо! -------------------------------------------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 11:27 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
авторполучаю через переданный хендл указатель на диалогчерез хендл - указатель??? Имхо, не должно работать. Какой конкретно функцией ты этот указатель получаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 15:57 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
maXmo авторполучаю через переданный хендл указатель на диалогчерез хендл - указатель??? Имхо, не должно работать. Какой конкретно функцией ты этот указатель получаешь? maXmo авторполучаю через переданный хендл указатель на диалогчерез хендл - указатель??? Имхо, не должно работать. Какой конкретно функцией ты этот указатель получаешь? иожет я некорректно выразился, я имел в виду следующее: в OnInitDialog Код: plaintext в LoadingThread Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. я так же пробовал таким же образом передавать указатель на CString результат схож: эффект такой как будто юзаю неинициализированный (даже не NULL) указатель, хотя если его проверить в OnInitDilalog, то он будет корректен!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 21:12 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
а this в OnInitDialog и pDlg в LoadingThread в одно место указывают? валиден ли pDB после вызова AfxBeginThread? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 10:47 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
да... и не понятно, он у тебя сидит в pDBSett или в pDB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 10:49 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
maXmoда... и не понятно, он у тебя сидит в pDBSett или в pDB? pDB = pDBSett ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 20:06 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
Не проще ли передавать указатель на CDaoDatabase в поток непосредсвенно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 21:44 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
1) картинка - ужоснах 2) http://sql.ru/forum/actualthread.aspx?tid=340864#3171307 3) указатель сидит в САпп, что ты его дёргаешь туда-сюда? 4) попробуй CWnd::FromHandlePermanent ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 23:53 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
maXmo1) картинка - ужоснах 2) http://sql.ru/forum/actualthread.aspx?tid=340864#3171307 sorry maXmo указатель сидит в САпп, что ты его дёргаешь туда-сюда? так задумано, дальше будет хлеще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2006, 08:49 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
roman10Не проще ли передавать указатель на CDaoDatabase в поток непосредсвенно? каким образом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2006, 08:51 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
maXmo4) попробуй CWnd::FromHandlePermanent ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2006, 08:59 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
4) почитай, в чём разница между этими методами до полного просветления. 5) то, как ты пытаешься получить члены СДлг через хвнд в другом потоке - это точно неправильно. 6) передавай вместо хвнд указатель сразу на СДлг. А лучше завести отдельный контейнер для данных типа СДокумента или как там это по уму делается... Cerebrumтак задумано, дальше будет хлещеда уже мозга на мозге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2006, 16:29 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
Cerebrum 4. В CDlg’е в OnInitDialog запускаю поток и передаю ему хендл диалога. 5. В потоке получаю через переданный хендл указатель на диалог и проверяю указатель на CDaoDatabase. А почему бы не передавать потоку напрямую указатель на этот CDaoDatabase ? Это чтобы жизнь медом не казалась ? Cerebrum Что получается: 1. Если поставить брекпоинты на моменте передачи диплогу указателя и моменте проверки указателя в созданном потоке, то значения этих указателей разные, а точнее: в первом случае все ОК, а в потоке он ссылается на какую-то неинициализированную область памяти, в общем, в никуда. Если до и после передачи указатели разные, значит ты их неправильно передаешь. Надо передавать правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2006, 22:21 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
Тут есть потенциальная засада. если к моменту старта дочернего потока диалог уже закроется, то объект диалога будет уничтожен и указатель на него будет невалиден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2006, 22:25 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
MasterZiv... Попробую ответить сразу на все. 1. Не передаю по одной простой причине: мне нужно помимо контролирования класса CDaoDatabase, контролировать контролы на диалоге, поэтому я предпочел передать указатель на объект класса, производный от CDialog, который несет в себе указатель на объект БД. 2. Обязательно учту, про закрытие диалога раньше старта, но такого не будет, т.к. диалог при выходе контролирует завершен ли запущенный поток или нет, и в случае незавершения ждет его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2006, 21:39 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
Cerebrum...мне нужно помимо контролирования класса CDaoDatabase, контролировать контролы на диалоге, поэтому я предпочел передать указатель на объект класса, производный от CDialog, который несет в себе указатель на объект БД.... не забудьте только синхронизировать доступ из разных ниток к одним и тем же ресурсам (т.е. объектам в памяти)... Иначе нихрена работать не будет... и ышо...попробуйте заюзать APIшную функцию старт апа потока (у Рихтера толково обговорено). На вскидку не помню, но у МФЦ надо поаккуратней с памятью. Вполне возможно, что пул используется другой... Тут должно влиять (если не глючу) статик-не статик библиотека. Если у Вас в проекте шаред дэлеле - попытайтесь поставить статик... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 13:02 |
|
||
|
про указатели и потоки
|
|||
|---|---|---|---|
|
#18+
kolobok0Иначе нихрена работать не будет...вообще, микросакс утверждает, что будет, но репу за такое всё равно чистят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 15:10 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34007609&tid=2030445]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 464ms |

| 0 / 0 |
