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

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). Подумать, а нужен ли тут вообще поток? Может юзеру лучше просто на часики посмотреть?