Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Не могу понять... Столкнулся с задачей, во время выполнения вызова хранимки на MS SQL 2000 через ADODB.Command программа блокируется на время выполнения. Для решения этой проблемы решил воспользоваться потоками. Те запускать обращения к базе в отдельном потоке. Во первых, прочел статьи по поводу многопотоковости. Например, http://www.vbnet.ru/article/showarticle.asp?id=20 Скачал известный пример Philipp Weidmann с использованием класса clsThreading.cls. Но во-первых проект приходится компилировать в P-code (посмотрел в примере Philipp Weidmann) иначе ругается msvbvm60.dll -те виртуальная машина. А компилировать в P-code не хочется. Так вот случае,если в нити происходит вызов хранимки через ADODB.Command все вылетает с ошибкой,даже если откомпилировать в P-code. Я не понимаю,потому что явно чего то не знаю.Почитав по форумав, понял что с потоками вообще очень даже не просто в VB. Может кто-нибудь объянит в чем тут дело?? Или как решить эту проблему, желательно с примером? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 14:24 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
А если выполнять СОММАНД асинхронно? Не подойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 14:53 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Верно. Здесь нужно асинхронное выполнение, добавь в опиции рекордсета adAsyncExecute. Когда он отработает будет вызванособытие ExecuteComplete, в нем и лови. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 16:35 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Моё исследование взаимодействия свойств, методов объектов ADO и порождаемых ими событий позволило выстроить следующую причинно-следственную цепочку. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 16:45 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Большое спасибо всем,особенно Processor за столь назвернутый ответ. Сделал в соответствии с твоим предложением, в IDE вроде бы все в порядке,а вот в exe когда запрос должен вернуть 180000 записей... в какой то момент все-таки на время подвисает (Not responding) %((( может я что то еще забыл??? Сделал следующий класс Option Explicit 'Класс для инициализации коннекта Private WithEvents con As ADODB.Connection Private cmdrs As ADODB.Command Private prmrs As ADODB.Parameter Public WithEvents RsRezult As ADODB.Recordset ' ............. 'Событие - выролнение окончено %) Event RsDone() ........... ' Private Sub Class_Initialize() Set con = New ADODB.Connection Set cmdrs = New ADODB.Command m_RezultIsEmpty = False End Sub ' Private Sub Class_Terminate() Set con = Nothing Set cmdrs = Nothing Set prmrs = Nothing Set RsRezult = Nothing End Sub 'Выполнение функции и возвращение результата в виде рекордсета 'CSEH: MyErrMsgBox Public Function Execute(Optional ByVal comtimeout As Integer = 30) As Boolean ' '<EhHeader> On Error GoTo Execute_Err '</EhHeader> OpenConnect With cmdrs .CommandText = Me.CommandText .CommandTimeout = comtimeout ' Set .ActiveConnection = con 'Запускается процесс асинхронного открытия рекордсета Set RsRezult = .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking _ + adAsyncExecute) End With '<EhFooter> Execute_Exit: Exit Function Execute_Err: Screen.MousePointer = 0 If MyErrorMessage(Err.Number, Err.Description, "FirmBaseClient.SqlConnection.Execute", comtimeout) = False Then MsgBox "Ошибка в FirmBaseClient.SqlConnection.Execute " & Err.Description & _ vbCrLf & " N:" & Err.Number End If Resume Execute_Exit '</EhFooter> End Function 'Открываем коннект Private Sub OpenConnect() With con .CursorLocation = Me.CursorLocation .Open Me.ConnectionString End With End Sub 'Обработчик события ExecuteComplete объекта ADODB.Connection ' поставляет состояние запрашиваемого рекордсета Private Sub con_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection) With RsRezult If .State = ObjectStateEnum.adStateClosed Then 'хранимая процедура вернула 0 записей.возбуждаем событие RsDone Me.RezultIsEmpty = True RaiseEvent RsDone Else If .RecordCount = 0 Then 'Вернулось 0 записей Me.RezultIsEmpty = True RaiseEvent RsDone Else .CacheSize = .RecordCount 'устраняем необходимость обработки события FetchProgress: 'программируем обмен не по одной записи,а пакетом из .RecordCount записей. End If End If End With End Sub 'Обработчик события FetchComplete не-Nothing (.RecordCount>0) рекордсета 'возбуждает событие RsDone и отключает рекордсет от сервера: 'все данные находятся на стороне клиента . Private Sub RsRezult_FetchComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) With RsRezult If .RecordCount > 0 Then Set .ActiveConnection = Nothing RaiseEvent RsDone End If End With End Sub 'Для распознавания состояния "Рекордсет отфильтрован" используем событие MoveComplete. 'Оно возбуждается в 15 ситуациях, индицируемых переменной adReason. 'Изо всех "резонов" (причин) единственный - adRsnRequery - сопутствует фильтрации. 'Его и используем для возбуждения события RsDone Private Sub RsRezult_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) If adReason = adRsnRequery Then RaiseEvent RsDone End If End Sub А вот сам вызов: Set asynccon = New SqlConnAsync With asynccon .CursorLocation = clUseClient .ConnectionString = MyConnectionString .CommandType = adCmdStoredProc .CommandText = "My_SearchRezultGetBySQl" ' 'Debug.Print msql .AddParameter "@sql", ptNtext, adParamInput, msql, 107374182 ' .Execute 90 End With Что я еще забыл??? почему все-таки иногда блокируется прога? Кроме того, кто-нибудь все-таки может внести хоть немного ясности про потоки в VB,почему надо компилировать в P-code? А в других режимах не хочет работать и почему у меня все вылетало? Это я про свою первую реализацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 13:16 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Приведенное мною описание причинно-следственных связей на скорую руку скопировано из внутреннего отчёта, поэтому детали контекста не видны. .CacheSize = .RecordCount как раз и продиктовано тем, что ХП возвращает выборку длиной максимум 200-300 записей (подмножество наименований контрагентов, выбранных по трёхсимвольной маске). В твоей задаче количество возвращаемых записей существено больше. Так и организуй фетчинг: он обеспечит тебя данными для построения прогресс-бара (это не главное) и анализа состояния коннекта после передачи каждой порции! Не скрою, процесс отладки асинхронки занял продолжительное время. Накидай все возможные обработчики, "подкрась" их активацию (типа Debug.Print) и анализируй, что необходимо, что достаточно, что избыточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 14:35 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
/topic/67542&hl=terminatethread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 15:40 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Что касается ссылки на многопотоковость,то там ничего интересного нет. Про то что поток лучше не убивать я уже много где прочел,а вот объяснения про P-code и других ответов нет.Но все равно спасибо Теперь вопрос про adAsyncFetch - Indicates that the remaining rows after the initial quantity specified in the CacheSize property should be fetched asynchronously. По умолчанию CacheSize=1, те как я понимаю .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking + adAsyncExecute) Означает,что выполнение асинхронное и если данные превышают CacheSize(а он по умолчанию 1),то возвращаются асинхронно - порциями, ну и кроме того поток не блокируется - adAsyncFetchNonBlocking. По Debug в Private Sub RsRezult_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Debug.Print "Progress: " & Progress & " MaxProgress: " & MaxProgress End Sub У меня возвращаетяс что типа Progress: 20060 MaxProgress: 20075 Progress: 20075 MaxProgress: 20090 .... Вопрос, как я понимаю данные возвращеются порциями по 15 записей??? А как сделать больше порцию??? Кроме того для создания processbar - как узнать сколько вообще должно вернутся записей,потому что MaxProgress - возвращает ожидаемое количество, а при обращении к .recordcount рекордсета - он разумеется запрашивает все оставшиеся записи. В примере: 2. Обработчик события ExecuteComplete объекта ADODB.Connection поставляет состояние запрашиваемого в п. 1 рекордсета: If .State = ObjectStateEnum.adStateClosed Then хранимая процедура вернула 0 записей. Отрицательный результат -знaчимый результат: возбуждаем событие RsDone, связанное (уже нами, а не Microsoft'ом) с рекордсетом rs: рекордсета нет (Nothing, иными словами), а событие есть и работает! Else .CacheSize = .RecordCount устраняем необходимость обработки события FetchProgress: программируем обмен не по одной записи, а пакетом из .RecordCount записей. End If запросив .RecordCount мы сразу вернули все записи, но мне все-таки не очень понятна работа с .CacheSize,кроме того это условие срабатывает при .State =9??? Что это за состояние рекордсета? Вроде как возвращаемая порция должна регулироваться .CacheSize,но как??? те как мне этим управлять? Вот что написано Use the CacheSize property to control how many records the provider keeps in its buffer and how many to retrieve at one time into local memory. For example, if the CacheSize is 10, after first opening the Recordset object, the provider retrieves the first 10 records into local memory. As you move through the Recordset object, the provider returns the data from the local memory buffer. As soon as you move past the last record in the cache, the provider retrieves the next 10 records from the data source into the cache. те как я понимаю именно в случае adAsyncFetch - сервер отдает именно порциями указаными в CacheSize? Я точно недопонимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 11:16 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
DimVB сервер отдает именно порциями указаными в CacheSize? Как только сервер закончил выполнение ХП, он "имеет что сказать за выполнение команды (и за рекордсет в частности)" и возбуждает событие ExecuteComplete. Параметры, передаваемые им в обработчик, тебе доступны для анализа и только потом - для изменения свойств объекта-параметра: ведь объект может быть Nothing! Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 11:51 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Вдогонку: Асинхронные запросы отлаживай на автономном от сервера компьютере, а лучше - компьютерах. Увы, это нелёгкий путь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 11:56 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Про нелегкий путь спасибо %)) Но я вижу,что ты очень хорошо разобрался в этом вопросе %))) Да,теперь становится яснее про ExecuteComplete (это было на поверхности,но мысль никак не могла сформироваться %)) ),но тут у меня тогда другой вопрос, ну во первых как все-таки узнать количество найденных записей??? RecordsAffected возвращает мне -1 %((( запросить .recocrdcount я не могу. Кроме того,даже если я выставляю например '********************************************************** ' Вот то место, где ты должен вычислить объём порции обмена и задать его: .CacheSize = 77 ' ....... End If По Debug в RsRezult_FetchProgress все равно ............. Progress: 182840 MaxProgress: 182855 CacheSize: 77 Progress: 182855 MaxProgress: 182870 CacheSize: 77 ............. те мне возвращают по 15 записей. ??? Правильно ли я понимаю,что когда произошло ExecuteComplete на стороне клиента еще нет никаких данных??? те нет рекордсета, поэтому когда говорим .CacheSize = .RecordCount, то как раз таки запрашиваем,те получаем весь рекордсет на сторону клиента!? Вот тут то и происходит зависание?? Кстати, не будет ли быстрее реализовать этот класс в отдельной dll с асинхронным вызовом,чтобы не тратить время на фетчинг??? те если мне не нужен процессбар? Ведь dll будет выполняться в отдельном процессе и соотвественно не подвесит программу. Мне просто интересно ты хоть приблизительно для себя определял на сколько медленее все работает с фетчингом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 12:28 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. Initial Fetch Size determines how many records are fetched synchronously before the asynchronous thread is created. This allows for a small recordset to be created without the additional overhead of creating a thread. This is set to 50 by default. To guarantee that FetchProgress and FetchComplete are called, set this value to 0. Background Fetch Size determines how many records are fetched between calls to the FetchProgress event. This is set to 15 by default. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 13:17 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
1. Коллеги как-то робко намекали про контролы: нет ли у тебя контролов типа ADOData и т.п. Ты не ответил. Возможно, между твоим кодом и сервером есть нечто ещё, маскирующее некоторые события. Чтобы быстрее вникнуть в "что, где, когда", выхолости задачу до безобразия: оставь только вызов ХП с небольшим объёмом возвращаемых записей. Идеально - если это БД Northwind: она доступна всем. А затем усложняй задачу. 2. DimVB как все-таки узнать количество найденных записей??? RecordsAffected возвращает мне -1 %((( запросить .recocrdcount я не могуRecordsAffected As Long, pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, pCommand As ADODB.Command, pRecordset As ADODB.Recordset, pConnection As ADODB.Connection Зачем так много всякого? Для того, чтобы понять, почему "RecordsAffected возвращает мне -1", а поток данных всё же передаётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 13:57 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. При попытке установить в ExecuteComplete - ругается что данное свойство read-only %(( К тому же,я так и не понял - почему при вызове .CacheSize = .RecordCount может подвисать??? потому что в этот момент мы запрашиваем ВЕСЬ рекордсет с сервера??? или нет??? до этого момента на стороне клиента есть что-нибудь? И если мы напишем .CacheSize = .RecordCount в ExecuteComplete - почему не вызывается FetchProgress или вызывается но мало раз?? те тогда уже не надо устанавливать "Background Fetch Size"? и по сути,я так понимаю - смысл этого "Background Fetch Size" только в том,чтобы вызывать FetchProgress? Прошу прощения, но я просто не заметил нигде намека на вопрос о контролах %))) Нет,их нет. Все раелизованно через класс,которые здесь же я и приводил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 14:09 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
При попытке установить в ExecuteComplete - ругается что данное свойство read-only %(( а зачем в ExecuteComplete? Надо перед Set RsRezult = .Execute.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 14:16 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Да, это я уже посмотрел, что надо до вызова,но тогда (см. пример моего класса выше) надо давать Set RsRezult.ActiveConnection = con, а у меня сразу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. те вставив Set RSrezult = New ADODB.Recordset Set RSrezult.ActiveConnection = con RSrezult.Properties("Background Fetch Size") = 77 перед .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking + adAsyncExecute) И кроме того,даже после это посмотрев в debug Код: plaintext 1. 2. 3. Получил следующее Progress: 182810 MaxProgress: 182825 Progress: 182825 MaxProgress: 182840 те все равно 15,Но я думаю что все дело еще в том,что я использую cmdrs As ADODB.Command ??? В смысле из-за этого игнорируется RSrezult.Properties("Background Fetch Size") = 77?? Processor предлагает вычислить размер порции в ExecuteComplete!!! %))) а как там установить это совйство,если он уже read-only? Я видимо совсем плох,потому как не совсем понимаю %))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 14:31 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
"Все и немедленно" - стиль, насаждаемый Jeans для выкачивания денег. "Поспешай медленно" - опыт прошлых поколений, но не устаревший. "Я видимо совсем плох,потому как не совсем понимаю %)))" - это близко к панике. Сядь, подумай, не гони волну! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 15:14 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет %))) Я совсем не близок к панике. Да и действительно хочется разобраться, но сроки поджимают,скоро сдача проекта, а эта часть сам понимаешь не последняя %))) Вопрос о выполнении в фоновом режиме запроса встал передо мной в понедельник - сейчас пятница %))) решение конечно мне подсказали - за что всем ответившим огромное спасибо (особенно Processor), но оно еще не идеально. Да уже сейчас у меня работает - те у пользвателя на экране что то крутится,а в это время выполняется запрос и не блокирует программу, но вот вопрос с размером порций не решен...буду думать... но фактор времени.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 15:41 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Проблема возможно как раз в работе через Command. Попробуй без нее. Просто rs.Open со всеми параметрами в options. На счет библиотеки. В принципе будет та же бодяга. Там тебе придется организовать колбек для получения данных. И что нам это даст? А даст маршалинг рекордсета через границы процесса. Не самая быстрая операция. Так что ИМХО лучше уж внутри. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 15:52 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Ну убейте меня, не поверю я, что юзеру удобно будет ползать по гриду в 20 000 строк! Так зачем их качать на клиента? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 16:08 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
В некоторых случаях бывает удобно :) Мы же пока что во внутреннстях колупаемся и саму задачу не знаем. Задачи разные нужны, задачи разные важны :) Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 16:23 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
По поводу размера порций... перед открытием ставь rs.PageSize = кол-во записей... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 16:43 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Про разные и важные задачи спасибо %))) речь идет о поисковой адресной базе - сейчас она уже перевалила за 200тыс. необходим отбор достаточно большого количества данных на сторону клиента (ну просто нужно %)) ) Я уже реализовал мастер запросов - это его выполнение. Сейчас смотрю debug FetchProgress и такое ощещение что туплю %)) Вот что он мне пишет по поводу возвращения 150 строк Progress: 140 MaxProgress: 155 Как я понимаю осталось передать в рекордсет 140 записей Progress: 125 MaxProgress: 140 Как я понимаю осталось передать в рекордсет 125 записей и тд Progress: 110 MaxProgress: 125 Progress: 95 MaxProgress: 110 Progress: 80 MaxProgress: 95 Progress: 65 MaxProgress: 80 На последнем этапе осталось 50,а тут уже срабатывает "Initial Fetch Size"=50 Но тут мне опять же не совсем понятно, почему при том что должно вернуться 150 строк,первая в дебаге 155??? Вызывается событие ExecuteComplete. И к этому моменту как я понимаю в рекордсете все данные??? Правильно? Потому уже срабатывает FetchComplete и снова FetchProgress. Так зачем мне вообще кидать .cachesize что-либо??? Для увеличения скорости работы с рекордсетом?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 16:51 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
Забей на MaxProgress - A Long value indicating the maximum number of records expected to be retrieved. Кроме того оно приблизительное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 17:06 |
|
||
|
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
|
|||
|---|---|---|---|
|
#18+
ExecuteComplete на сервере. Отработала команда и выдаёт статус завершения. Ты должен принять решение - какая команда, завершилась ли и как завершилась. Для извлечения семантики тебе передаются скаляры и указатели на объекты. Зная контекст запроса, ты выбираешь тот или иной объект и анализируешь те или другие его свойства. В зависимости от ВОЗМОЖНЫХ значений свойств направляешь в то или иное русло ход программы. А что именно заложено в мнемонику значения св-ва, не всегда ясно. Мне не удалось найти временную диаграмму последовательности возникновения событий: её, наверное, нет в природе. Поэтому приходится, как тебе, продираться через дебри, но это не значит, что в следующей задаче всё пойдёт как по маслу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2004, 17:38 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=32459035&tid=2169859]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 373ms |

| 0 / 0 |
