ODBC и потоки
Спасибо.
оП ОБ РЕТЧПЕ, ЮФП ВЩ РПУНПФТЕМ:
1. вЙВМЙПФЕЛБ ODBC, ЛПФПТХА ЙУРПМШЪХЕЫШ НПЦЕФ ВЩФШ ОЕ РПФПЛПВЕЪПРБУОПК, Ф.Е. ОБРТЙНЕТ ПВЯСЧМСС, ОБРТЙНЕТ, ПВЯЕЛФ Recordset Ч ЗМБЧОПН РПФПЛЕ Й РЕТЕДБЧБС ХЛБЪБФЕМШ ОБ ОЕЗП Ч ДТХЗПК. нПЦОП ТЕЫЙФШ ЙУРПМШЪХС НБТЫБМЙОЗ ЙОФЕТЖЕКУБ.
2. еУМЙ ЬФП MFC РПФПЛ Й ЙУРПМШЪХЕЫШ ЧЩЪПЧЩ COM - Ч ЖХОЛГЙЙ РПФПЛБ ДП ЧЩЪПЧБ НЕФПДПЧ COM ДПМЦЕО ВЩФШ AfxOleInit(). дМС Win32 - OleInitialize(NULL);
3. ЧПЪЧТБЭБФШ (return 0) ЕУМЙ ЧУЕ Ч РПТСДЛЕ;
Цитата:
Originally posted by Jeff
рЙЫХ ХФЙМХ, ЛПФПТБС ЧЩЗТХЦБЕФ ЛПЕ-ЮПЗП ЙЪ ВБЪЩ ДБООЩИ Й ЧРЙИЙЧБЕФ ЬФП Ч ListControl. дБООЩИ Ч ВБЪЕ НОПЗП ( ЪБЗТХЪЛБ ЙДЕФ УЕЛХОД 10 ) РПФПНХ ЮФПВ ОЕ "НПТПЪЙМПУШ" ПЛПЫЛП ЪБЗТХЪЛХ С ПЖПТНЙМ ПФДЕМШОЩН РПФПЛПН. фПМШЛП ЧПФ ЛПЗДБ РПФПЛ ЪБЧЕТЫБЕФУС, ЧЩУЛБЛЙЧБЕФ Unhandled exception. ч ЮЕН РТПВМЕНБ, ОЙЛБЛ ОЕ РПКНХ. рПНПЗЙФЕ, РПЦБМХКУФБ.
уРБУЙВП.
рЙЫХ ХФЙМХ, ЛПФПТБС ЧЩЗТХЦБЕФ ЛПЕ-ЮПЗП ЙЪ ВБЪЩ ДБООЩИ Й ЧРЙИЙЧБЕФ ЬФП Ч ListControl. дБООЩИ Ч ВБЪЕ НОПЗП ( ЪБЗТХЪЛБ ЙДЕФ УЕЛХОД 10 ) РПФПНХ ЮФПВ ОЕ "НПТПЪЙМПУШ" ПЛПЫЛП ЪБЗТХЪЛХ С ПЖПТНЙМ ПФДЕМШОЩН РПФПЛПН. фПМШЛП ЧПФ ЛПЗДБ РПФПЛ ЪБЧЕТЫБЕФУС, ЧЩУЛБЛЙЧБЕФ Unhandled exception. ч ЮЕН РТПВМЕНБ, ОЙЛБЛ ОЕ РПКНХ. рПНПЗЙФЕ, РПЦБМХКУФБ.
уРБУЙВП.
Но на первое, что бы посмотрел:
1. Библиотека ODBC, которую используешь может быть не потокобезопасной, т.е. например объявляя, например, объект Recordset в главном потоке и передавая указатель на него в другой. Можно решить используя маршалинг интерфейса.
2. Если это MFC поток и используешь вызовы COM - в функции потока до вызова методов COM должен быть AfxOleInit(). Для Win32 - OleInitialize(NULL);
3. возвращать (return 0) если все в порядке;
Я создаю обьект CRecordset прямо внутри потока, внутрь ему [потоку] даю h_Wnd создающего поток окна и указатель на его класс. С COM вроде не работаю - делаю через CreateThread
В поток можно передать HWND, а потом "реконструировать" указатель на CWnd.
CWnd* pWnd = CWnd::FromHandle(hwnd);
или FromHandlePermanent.
И CRecordset использует вызовы OLE - AfxOleInit поставить необходимо.
PS:
В MSDN хорошо объясняется работа с MFC в потоках.
Цитата:
Originally posted by Jeff
Я создаю обьект CRecordset прямо внутри потока, внутрь ему [потоку] даю h_Wnd создающего поток окна и указатель на его класс. С COM вроде не работаю - делаю через CreateThread
Я создаю обьект CRecordset прямо внутри потока, внутрь ему [потоку] даю h_Wnd создающего поток окна и указатель на его класс. С COM вроде не работаю - делаю через CreateThread
Цитата:
Originally posted by dmitry_moiseev
Похоже что передаешь указатель на CWnd в другой поток, а это делать нельзя.
В поток можно передать HWND, а потом "реконструировать" указатель на CWnd.
CWnd* pWnd = CWnd::FromHandle(hwnd);
или FromHandlePermanent.
И CRecordset использует вызовы OLE - AfxOleInit поставить необходимо.
PS:
В MSDN хорошо объясняется работа с MFC в потоках.
Похоже что передаешь указатель на CWnd в другой поток, а это делать нельзя.
В поток можно передать HWND, а потом "реконструировать" указатель на CWnd.
CWnd* pWnd = CWnd::FromHandle(hwnd);
или FromHandlePermanent.
И CRecordset использует вызовы OLE - AfxOleInit поставить необходимо.
PS:
В MSDN хорошо объясняется работа с MFC в потоках.
ОК, спасибо, буду читать.
Ээ, а почему нельза m_hWnd давать в поток? Я это часто делаю чтоб потом делать ::PostMessage типа поток выполнил все нужное? Вроде как работает, потому и возник вопрос. Если что можешь ссылку дать - сам разберусь.
но передавать указатель на экземляр класса MFC нельзя (это объясняется тем, что объекты привязаны к потоку их создавшего используя TLS Thread Local Storage).
Статья в MSDN с названием "Multithreading: Programming Tips".
Цитата:
Originally posted by Jeff
ОК, спасибо, буду читать.
Ээ, а почему нельза m_hWnd давать в поток? Я это часто делаю чтоб потом делать ::PostMessage типа поток выполнил все нужное? Вроде как работает, потому и возник вопрос. Если что можешь ссылку дать - сам разберусь.
ОК, спасибо, буду читать.
Ээ, а почему нельза m_hWnd давать в поток? Я это часто делаю чтоб потом делать ::PostMessage типа поток выполнил все нужное? Вроде как работает, потому и возник вопрос. Если что можешь ссылку дать - сам разберусь.