Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ODBC и потоки

1.8K
26 апреля 2003 года
Jeff
94 / / 22.04.2003
Пишу утилу, которая выгружает кое-чого из базы данных и впихивает это в ListControl. Данных в базе много ( загрузка идет секунд 10 ) потому чтоб не "морозилось" окошко загрузку я оформил отдельным потоком. Только вот когда поток завершается, выскакивает Unhandled exception. В чем проблема, никак не пойму. Помогите, пожалуйста.

Спасибо.
4.0K
28 апреля 2003 года
dmitry_moiseev
7 / / 24.04.2003
оЕ РПНЕЫБМ ВЩ ЛПД ЖХОЛГЙЙ РПФПЛБ ВЕЪ ДЕФБМЕК.
оП ОБ РЕТЧПЕ, ЮФП ВЩ РПУНПФТЕМ:
1. вЙВМЙПФЕЛБ ODBC, ЛПФПТХА ЙУРПМШЪХЕЫШ НПЦЕФ ВЩФШ ОЕ РПФПЛПВЕЪПРБУОПК, Ф.Е. ОБРТЙНЕТ ПВЯСЧМСС, ОБРТЙНЕТ, ПВЯЕЛФ Recordset Ч ЗМБЧОПН РПФПЛЕ Й РЕТЕДБЧБС ХЛБЪБФЕМШ ОБ ОЕЗП Ч ДТХЗПК. нПЦОП ТЕЫЙФШ ЙУРПМШЪХС НБТЫБМЙОЗ ЙОФЕТЖЕКУБ.
2. еУМЙ ЬФП MFC РПФПЛ Й ЙУРПМШЪХЕЫШ ЧЩЪПЧЩ COM - Ч ЖХОЛГЙЙ РПФПЛБ ДП ЧЩЪПЧБ НЕФПДПЧ COM ДПМЦЕО ВЩФШ AfxOleInit(). дМС Win32 - OleInitialize(NULL);
3. ЧПЪЧТБЭБФШ (return 0) ЕУМЙ ЧУЕ Ч РПТСДЛЕ;


Цитата:
Originally posted by Jeff
рЙЫХ ХФЙМХ, ЛПФПТБС ЧЩЗТХЦБЕФ ЛПЕ-ЮПЗП ЙЪ ВБЪЩ ДБООЩИ Й ЧРЙИЙЧБЕФ ЬФП Ч ListControl. дБООЩИ Ч ВБЪЕ НОПЗП ( ЪБЗТХЪЛБ ЙДЕФ УЕЛХОД 10 ) РПФПНХ ЮФПВ ОЕ "НПТПЪЙМПУШ" ПЛПЫЛП ЪБЗТХЪЛХ С ПЖПТНЙМ ПФДЕМШОЩН РПФПЛПН. фПМШЛП ЧПФ ЛПЗДБ РПФПЛ ЪБЧЕТЫБЕФУС, ЧЩУЛБЛЙЧБЕФ Unhandled exception. ч ЮЕН РТПВМЕНБ, ОЙЛБЛ ОЕ РПКНХ. рПНПЗЙФЕ, РПЦБМХКУФБ.

уРБУЙВП.

4.0K
28 апреля 2003 года
dmitry_moiseev
7 / / 24.04.2003
Не помешал бы код функции потока без деталей.
Но на первое, что бы посмотрел:
1. Библиотека ODBC, которую используешь может быть не потокобезопасной, т.е. например объявляя, например, объект Recordset в главном потоке и передавая указатель на него в другой. Можно решить используя маршалинг интерфейса.
2. Если это MFC поток и используешь вызовы COM - в функции потока до вызова методов COM должен быть AfxOleInit(). Для Win32 - OleInitialize(NULL);
3. возвращать (return 0) если все в порядке;
1.8K
28 апреля 2003 года
Jeff
94 / / 22.04.2003
Я создаю обьект CRecordset прямо внутри потока, внутрь ему [потоку] даю h_Wnd создающего поток окна и указатель на его класс. С COM вроде не работаю - делаю через CreateThread
4.0K
28 апреля 2003 года
dmitry_moiseev
7 / / 24.04.2003
Похоже что передаешь указатель на CWnd в другой поток, а это делать нельзя.
В поток можно передать HWND, а потом "реконструировать" указатель на CWnd.
CWnd* pWnd = CWnd::FromHandle(hwnd);
или FromHandlePermanent.
И CRecordset использует вызовы OLE - AfxOleInit поставить необходимо.
PS:
В MSDN хорошо объясняется работа с MFC в потоках.

Цитата:
Originally posted by Jeff
Я создаю обьект CRecordset прямо внутри потока, внутрь ему [потоку] даю h_Wnd создающего поток окна и указатель на его класс. С COM вроде не работаю - делаю через CreateThread

1.8K
28 апреля 2003 года
Jeff
94 / / 22.04.2003
Цитата:
Originally posted by dmitry_moiseev
Похоже что передаешь указатель на CWnd в другой поток, а это делать нельзя.
В поток можно передать HWND, а потом "реконструировать" указатель на CWnd.
CWnd* pWnd = CWnd::FromHandle(hwnd);
или FromHandlePermanent.
И CRecordset использует вызовы OLE - AfxOleInit поставить необходимо.
PS:
В MSDN хорошо объясняется работа с MFC в потоках.



ОК, спасибо, буду читать.
Ээ, а почему нельза m_hWnd давать в поток? Я это часто делаю чтоб потом делать ::PostMessage типа поток выполнил все нужное? Вроде как работает, потому и возник вопрос. Если что можешь ссылку дать - сам разберусь.

4.0K
28 апреля 2003 года
dmitry_moiseev
7 / / 24.04.2003
HWND передавать в поток можно, и посылать сообщения окну через ::PostMessage можно,
но передавать указатель на экземляр класса MFC нельзя (это объясняется тем, что объекты привязаны к потоку их создавшего используя TLS Thread Local Storage).
Статья в MSDN с названием "Multithreading: Programming Tips".

Цитата:
Originally posted by Jeff


ОК, спасибо, буду читать.
Ээ, а почему нельза m_hWnd давать в поток? Я это часто делаю чтоб потом делать ::PostMessage типа поток выполнил все нужное? Вроде как работает, потому и возник вопрос. Если что можешь ссылку дать - сам разберусь.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог