|
|
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Не могу подключитса к базе данных Access 2000 на С++ в VS6 . Мне надо в функции main() подключится к одной таблице и в thread-e к другой. В функции main()я смог подключить ADO object recordset а вот в thread тем же способом пытаюсь и не получается :( В чём может быть проблема? помогите пожалуста. Вот код из main() HRESULT hrU = S_OK; _bstr_t strCnn1("Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\myfolder\\mydata.mdb;Uid=Admin;Pwd=;"); _RecordsetPtr pRstUsers = NULL; hrU = pRstUsers.CreateInstance(__uuidof(Recordset)); if(FAILED(hrU)) { printf("Failed creating record set instance for users\n"); return; } pRstUsers->Open("SELECT * FROM USERS", strCnn1, adOpenStatic, adLockReadOnly, adCmdText); pRstUsers->MoveFirst(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2006, 16:06 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Не уверен что помогу, но 1. действительно ли тот же код использовался из другой thread ? 2. не был ли уже открыт connection в первичной thread ? просто вопросы для раздумья - с Access дела не имел, но в "embedded Oracle SQL" приходилось давать "exec sql enable threads" иначе не из первичной thread ничего зделать было невозможно. К сожалению не сталкивался с ADO но думаю что все равно упрется в драйвера (ODBC?) лежащие под ним. -- СК ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2006, 10:12 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Я тоже думаю, что без ODBC ничего не получится. Или нужно исползовать MFC оболочку. Я работал с Access только, через ODBC, потому как ADO на машине, где нужно было устанваливать программу - не заработала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2006, 14:05 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
ODBC настроен так как в main()-е я подключаюсь к базе. Проблема только в threade. 1. действительно ли тот же код использовался из другой thread ? Да. Я тот же код использывал в в threade что был в main()-e 2. не был ли уже открыт connection в первичной thread ? я пытался открывать connection в threade и не открывать. Всё равно не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 08:52 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
MuromezВ функции main()я смог подключить ADO object recordset а вот в thread тем же способом пытаюсь и не получается В каком смысле не получается? В чем это выражается? В случае ошибок VC-ная обертка над COM объектами выкидывает ислкючения _com_error. Вам нужно поймать его и выудить сообщение об ошибке. Может также, стоит отказаться от использования ODBC и юзать OLE DB. Т.е. изменить строку подключения на "Provider=Microsoft.Jet.OLEDB.4.00; Data Source=Database.mdb". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 09:58 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
В threade _com_error вот такие ошибки printf("Code meaning = %s\n", (char*) e.ErrorMessage()); Invalid pointer printf("Source = %s\n", (char*) e.Source()); Null В задаче сказано использовать в Threade один обьект АДО, тут надо использовать функции CriticalSection. Но я даже, при использование ADO обьектами(чтоб избежать RaceCondition взаимное сотязание) для каждого thread-a использываю локальные обьекты каждого thread-a и всё равно не принемаю параметры из таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 12:27 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Вопрос такой. Можно использывать эту функцию pRstTable->Open(...)несколько раз подряд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 12:38 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Похоже, что pRstUsers у вас - нулевой указатель. Проверьте его значение. В каком месте возникает исключение? авторВ задаче сказано использовать в Threade один обьект АДО, тут надо использовать функции CriticalSection. Один объект на поток или на всю программу? авторВопрос такой. Можно использывать эту функцию pRstTable->Open(...)несколько раз подряд? Если предварительно вызывать Close, то можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 13:12 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Один объект на поток или на всю программу?. Oдин обьект на поток thread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 13:37 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
авторВопрос такой. Можно использывать эту функцию pRstTable->Open(...)несколько раз подряд? Если предварительно вызывать Close, то можно.[/quot] Все таблицы или достаточно той на которую я буду снова делать Open. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 13:57 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
авторOдин обьект на поток thread. Тогда критические секции ни к чему. авторВсе таблицы или достаточно той на которую я буду снова делать Open. Той, на которой снова будет Open. А точнее не таблицы, а рекордсета. Как там дела с указателем то? Решилась проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 14:13 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
roman10 авторOдин обьект на поток thread. Тогда критические секции ни к чему. авторВсе таблицы или достаточно той на которую я буду снова делать Open. Той, на которой снова будет Open. А точнее не таблицы, а рекордсета. Как там дела с указателем то? Решилась проблема? Ошибку больше не выдаёт, но я не могу понять почему мой pRstReport которому я делаю Open() Close() в thread-e. Не принемает рекордсет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 14:27 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
По поводу критической секции. Main() делает Select * From Users, по каждому юзеру создаём Thread() у юзера есть ReportID. Thread должeн сделать Select * From Report WHERE ReportID==UID. Связь между таблицами 1-N. pRstReport (рекордсет) будет одновременно принемать разные значения. Тем более он один для всех Thread() . Но даже когда у меня pRstReport для каждого Thread() он всё равно получает чёрт знает что :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 14:42 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
MuromezpRstReport (рекордсет) будет одновременно принемать разные значения. Тем более он один для всех Thread() . Но даже когда у меня pRstReport для каждого Thread() он всё равно получает чёрт знает что :( Ну дык в чем проблема выражается то? Что конкртно получает pRstReport? Какие ошибки и где он выдает. И вообще код в студию. С "Invalid pointer" вы, как я понимаю, справились. А дальше в чем затык? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 15:51 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 17:44 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Muromez как ты подрубил дллку? у меня студия 2003 NET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 18:01 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
NickG_aMuromez как ты подрубил дллку? у меня студия 2003 NET Я включил поисковик и он мне нашёл в этой дериктории C:\Program Files\Common Files\System\ado\msado15.dll Как он там появился, я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 19:40 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Вообщем я реализовал такие функции: добавление новой записи, редактирование старых, удаление. Ну это все сделал в один клас - там токо функционал. Осталось токо реализовать интерфейс с пользователем. Вот мой пример хотя он еще не оптимизирован(просто работает!) если кому-то поможет // Warehouse.р #pragma once struct Product { int Id; LPCSTR Name; float fCount; LPCSTR Merka; }; // CWarehouse class CWarehouse { public: CWarehouse(); virtual ~CWarehouse(); //Добавление определенного количества продукции с опред айдишником на склад bool AddCount(int Id, float fCount); //Добавление в каталог новой продукции void Add(int Id,LPCSTR Name,float fCount,LPCSTR Merka); //Возращает количество продукции на складе float GetCount(int id); //Забирает со склада продукцию с определенным индетификатором bool DeletCount(int Id, float fCount); //Удалеет полностью продукт из каталога bool DeletProduct(int Id); //Изменяем старый айди на новый bool ChangeId(int oldId, int newId); //Изменяем количество продукции bool ChangefCount(int Id,float newfCount); //Изменяем Имя bool ChangeName(int Id, LPCSTR newName); //Изменяем меру измерения продукта bool ChangeMerka(int Id,LPCSTR newMerka); //Вовращает продукт с определенным индентификатором Product FindProduct(int Id); }; ------------------------------------------------------------------------------------ // Warehouse.cpp : implementation file // #include "stdafx.h" #import "c:\Program Files\Common Files\system\ado\msadox.dll" #import "c:\Program Files\Common Files\system\ado\msado15.dll"\ no_namespace rename("EOF", "EndOfFile") #include <ole2.h> #include <stdio.h> #include "conio.h" #include "string.h. " #include "stdafx.h" #include "New.h" #include "NewDlg.h" #include "Warehouse.h" inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}; // CWarehouse CWarehouse::CWarehouse() { } CWarehouse::~CWarehouse() { } bool CWarehouse::DeletCount(int szId, float szfCount) { if(GetCount(szId)<=0) { AfxMessageBox("Недостаточно ресурсов для забора"); return false; } HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; _bstr_t arr=(_bstr_t)szfCount; char *str=(char *)arr; for(int i=0;i<strlen(str);i++) { if(str ==',') { str='.'; } } a+="UPDATE Sklad SET fCount = fCount-"; a+=str; a+=" Where ID="; a+=(_bstr_t)szId; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } bool CWarehouse::AddCount(int szId, float szfCount) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; _bstr_t arr=(_bstr_t)szfCount; char *str=(char *)arr; for(int i=0;i<strlen(str);i++) { if(str==',') { str='.'; } } a+="UPDATE Sklad SET fCount = fCount+"; a+=str; a+=" Where Id = "; a+=(_bstr_t)szId; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } void CWarehouse::Add(int szId,LPCSTR szName,float szfCount,LPCSTR szMerka) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; //заменяем символ , на . _bstr_t a; _bstr_t arr=(_bstr_t)szfCount; char *str=(char *)arr; for(int i=0;i<strlen(str);i++) { if(str==',') { str='.'; } } a+="Insert Into Sklad (ID, Name, fCount, Merka) Values ("; a+=(_bstr_t)szId; a+=",'"; a+=szName; a+="',"; a+=str; a+=",'"; a+=szMerka; a+="')"; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; //например "INSERT INTO Sklad Values (11121,'1',1,'1')"; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); } catch(_com_error &e) { AfxMessageBox(e.Description()); } pConnection->Close(); } float CWarehouse::GetCount(int szId) { HRESULT hr = S_OK; _RecordsetPtr pRst = NULL; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; float res; _bstr_t a; a+="SELECT fCount FROM Sklad Where ID = "; a+=(_bstr_t)szId; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; //например "INSERT INTO Sklad Values (11121,'1',1,'1')"; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pRst=pCmd->Execute(NULL,NULL,adCmdText); res=(float)pRst->Fields->GetItem("fCount")->Value; } catch(_com_error &e) { AfxMessageBox(e.Description()); return NULL; } pConnection->Close(); return res; } Product CWarehouse::FindProduct(int szId) { HRESULT hr = S_OK; _RecordsetPtr pRst = NULL; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; Product res; _bstr_t a; a+="SELECT * FROM Sklad Where ID = "; a+=(_bstr_t)szId; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; //например "INSERT INTO Sklad Values (11121,'1',1,'1')"; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pRst=pCmd->Execute(NULL,NULL,adCmdText); res.Id=(int)pRst->Fields->GetItem("Id")->Value; res.fCount=(float)pRst->Fields->GetItem("fCount")->Value; res.Name=(_bstr_t)pRst->Fields->GetItem("Name")->Value; res.Merka=(_bstr_t)pRst->Fields->GetItem("Merka")->Value; } catch(_com_error &e) { AfxMessageBox(e.Description()); } pConnection->Close(); return res; } bool CWarehouse::DeletProduct(int Id) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; a+="DELETE FROM Sklad Where Id="; a+=(_bstr_t)Id; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } bool CWarehouse::ChangeId(int oldId, int newId) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; a+="Update Sklad Set Id = "; a+=(_bstr_t)newId; a+=" Where Id = "; a+=(_bstr_t)oldId; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } bool CWarehouse::ChangefCount(int Id,float newfCount) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; _bstr_t arr=(_bstr_t)newfCount; char *str=(char *)arr; for(int i=0;i<strlen(str);i++) { if(str==',') { str='.'; } } a+="Update Sklad Set fCount = "; a+=str; a+=" Where Id = "; a+=(_bstr_t)Id; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } bool CWarehouse::ChangeName(int Id, LPCSTR newName) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; a+="Update Sklad Set Name = "; a+=(_bstr_t)newName; a+=" Where Id = "; a+=(_bstr_t)Id; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } bool CWarehouse::ChangeMerka(int Id,LPCSTR newMerka) { HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CommandPtr pCmd = NULL; _bstr_t a; a+="Update Sklad Set Merka = "; a+=(_bstr_t)newMerka; a+=" Where Id = "; a+=(_bstr_t)Id; try { TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection))); TESTHR(hr = pCmd.CreateInstance(__uuidof(Command))); pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;" "data source=c:\\b.mdb;","","",NULL); pCmd->CommandText =a; pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection)); pCmd->Execute(NULL,NULL,adCmdText); pConnection->Close(); return true; } catch(_com_error &e) { AfxMessageBox(e.Description()); return false; } } // CWarehouse message handlers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 20:46 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
Хм, у меня все скомпилировалось и заработало... Правда, два замечения. 1. Запустив дочерние потоки, вы не ждете в основном потоке их завершения. Это приводит к тому, что дочерние потоки прибиваются до того, как они успевают сформировать отчет. Если после запуска усыпить main на пару секунд, то все происходит нормально. Просто ждать в main, конечно, нехорошо, но вот я не знаю, есть ли какой аналог WaitForMultipleObjects в сишной библиотеке. 2. В ThreadProc в самом конце обнаружился лишний вызов pRstReport->Close(), который выкидывает необработанное исключение, благополучно грохая все приложение целиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2006, 22:13 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
roman10Хм, у меня все скомпилировалось и заработало... Правда, два замечения. 1. Запустив дочерние потоки, вы не ждете в основном потоке их завершения. Это приводит к тому, что дочерние потоки прибиваются до того, как они успевают сформировать отчет. Если после запуска усыпить main на пару секунд, то все происходит нормально. Просто ждать в main, конечно, нехорошо, но вот я не знаю, есть ли какой аналог WaitForMultipleObjects в сишной библиотеке. 2. В ThreadProc в самом конце обнаружился лишний вызов pRstReport->Close(), который выкидывает необработанное исключение, благополучно грохая все приложение целиком. У тебя заработало в дочерних потоках pRstReport, смог ты сохранить данные в file.txt? Усыплять main это не правильно, если у pRstReport будет очень много recordset и по времени дочерний поток не успеет закончить работу то будет столкновение между дочерними потоками. Тутнадо сделать так чтоб дочерний поток не начал работу пока предыдуший не закончит её. Ещё в задачи у меня было сказано не создавать в дочернем потоке АДО обьект а использовать один для всех дочерних потоках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2006, 01:02 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
roman10Хм, у меня все скомпилировалось и заработало... Правда, два замечения. 1. Запустив дочерние потоки, вы не ждете в основном потоке их завершения. Это приводит к тому, что дочерние потоки прибиваются до того, как они успевают сформировать отчет. Если после запуска усыпить main на пару секунд, то все происходит нормально. Просто ждать в main, конечно, нехорошо, но вот я не знаю, есть ли какой аналог WaitForMultipleObjects в сишной библиотеке. 2. В ThreadProc в самом конце обнаружился лишний вызов pRstReport->Close(), который выкидывает необработанное исключение, благополучно грохая все приложение целиком. У меня всё заработало также при усыпления main(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2006, 01:12 |
|
||
|
Не могу подключится к DB Access на С++.
|
|||
|---|---|---|---|
|
#18+
MuromezУ меня всё заработало также при усыпления main(). Ура, товарищи! ...и в воздух чепчики бросали. MuromezТутнадо сделать так чтоб дочерний поток не начал работу пока предыдуший не закончит её. Смеялсо. Зачем же тогда нужны потоки, ежели вы все равно собираетесь пускать их друг за дружкой? В том то и прикол, что потоки позволяют распараллелить вычисления. MuromezЕщё в задачи у меня было сказано не создавать в дочернем потоке АДО обьект а использовать один для всех дочерних потоках. Странное требование. Ведь большую часть времени ваши потоки работают с рекордсетом, и если он будет один, то все потоки будут ждать, пока он наконец освободится. Все опять таки выльется в очередь, и преемущества многопоточной обработки сойдут на нет. Может быть имелось ввиду использовать общий объект Connection, т.е. работать только с одним соединением к базе. В приведенном вашем примере, у вас каждый поток устанавливает новое подключение к базе, что не есть хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2006, 02:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33638414&tid=2031629]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 303ms |

| 0 / 0 |
