JPG 画像 (約 10 枚の写真、それぞれ約 150KB) を Web サーバーに送信するタイムクリティカルなプロセスが 1 つあります。送信中に、プロセス全体を高速化するために、他のデータの入力や選択などの他のアクションをユーザーに許可したいと思います。
私はスレッドを試してみましたが、経験がありません。そのため、最初の試行は最善の場合でした-同じです。そうしないと、Delphi がハングアップします。
_____________________________________________________________________
procedure DoOnCameraGrabFoto(iID:integer; pic: TPicture; iTyp: Byte; ts: TDateTime);
const
SVC_AddFoto2Master='';
var
req: TIdMultiPartFormDataStream;
blob: TStream;
begin
with dtsBlobs.DataSet do begin
// At first add images to local dataset, just to see them...
Append;
FieldByName('MasterID').Value:=iID;
FieldByName('DateAndTime').Value := ts;
FieldByName('PhotoType').Value := iTip;
blob:=CreateBlobStream((FieldByName('FotoObj') as TBlobField), bmWrite);
try
pic.Graphic.SaveToStream(blob);
////////////////////////////////////////////////////
//
// POST foto to server with Indy (Delphi 7)
//
req:=TIdMultiPartFormDataStream.Create;
try
req.AddFormField('iMasterID', IntToStr(iID));
req.AddFormField('iTyp' , IntToStr(iTip));
req.AddFormField('tsPhoto' , DateToSqlDate(ts, false)+ ' ' + TimeToStr(ts));
req.AddObject('oFoto', 'image/jpeg', blob, 'photo' );
// Folowing method do something like shown below
// ExecPostRequest('http://server:80/svcWebServiceThatPostData', req);
//
// ... and there is no problem when there are only one foto or two.
// But, when there is lot a fotos, in this meantime, operator can for example
// fill-out the form, or something else.
//
//
IdHTTP1.Request.ContentType:=req.RequestContentType;
result:=IdHTTP1.Post(sUrl, req);
finally
req.Free;
end;
//
///////////////////////////////////////////////////////
finally
blob.Free;
end;
Post;
end;