Как вызывать процедуру в потоке

Andrey Pogorelov

Привет всем.Суть такова. Делаю обход таблицы и для выбранных записей, вызываю процедуру с сервера на update.Теперь действо. Есть функция вызывающа процедуру на сервере:
<b>function</b> updateopl(fId, fOpl: integer): boolean;
<b>var</b> ASPExec2: TADOCommand;
<b>begin</b> <b>try</b> CoInitializeEx(<b>nil</b>, COINIT_MULTITHREADED); ASPExec2:= TADOCommand.Create(<b>nil</b>); ASPExec2.Connection:=DM.AConnection; ASPExec2.CommandType:=cmdStoredProc; ASPExec2.CommandText:='update_opl'; ASPExec2.ExecuteOptions:=ASPExec2.ExecuteOptions + [eoAsyncExecute, eoAsyncFetch]; ASPExec2.Parameters.Refresh; ASPExec2.Parameters.ParamByName('@tableid').Value:= fId; ASPExec2.Parameters.ParamByName('@oplata').Value:= fOpl; ASPExec2.Execute; result:=true; ASPExec2.Free; CoUninitialize; <b>except</b> on e:Exception <b>do</b> <b>begin</b> Messagebox(<b>0</b>,PChar(e.Message),'TMsgRetrieveThread.Retrieve', <b>0</b>); result:=false; <b>end</b>; <b>end</b>;
<b>end</b>;
Из программы вызываю так:MTChild - набор данных
MTChild.DisableControls; MTChild.Open; <b>while</b> <b>not</b> MTChild.Eof <b>do</b> <b>begin</b> updateopl(MTChild.FieldByName('ID').AsInteger, MTChild.FieldByName('Prihod').AsInteger); MTChild.Next; Application.ProcessMessages; <b>end</b>;
Теперь сам вопрос, если выполнять процедуру 'update_opl' синхронно, то обработка выполняется довольно долго, попытался завернуть выполнение процедуры в отдельный поток, получаю ошибку "Не удается выполнить операцию во время асинхронного выполнения." Как быть?PS: D2007, MSSQL2005
2 ответа

Andrey Pogorelov

засунь цикл EOF внутрь 'update_opl'______________________________________________Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!


Andrey Pogorelov

1. Использовать в thread'е отдельное соединение (чтоб его в из других потоков никто не теребил).2. Такую обработку ошибок - в топку.3. Всякие "асинхронные флаги" - в топку.4. Завести в thread'е поля для хранения массивов аргументов; сначала пробежкой по датасету их заполнить, потом в Execute в цикле сувать в хранимку.5. CoInitialize - вне цикла и try, CoUninitialize - вне цикла в finally.6 (скорее, 0). Подумать, а нужен ли тут вообще поток? Может юзеру лучше просто на часики посмотреть?