2
I need to wait for select and fill the list to finish in Thread for Function Result to receive the list loaded in the asynchronous method, is it possible? Follow the code of Function:
function PreencheCampos(const uniQuery: TuniQuery) : TList<iEstoqueLote>;
var
lista : TList<iEstoqueLote>;
begin
try
Application.CreateForm(TFrmLoading, FrmLoading);
FrmLoading.Show;
lista := TList<iEstoqueLote>.Create;
ThreadSql := TThread.CreateAnonymousThread(procedure
begin
uniQuery.Open;
if not uniQuery.IsEmpty then
begin
while not uniQuery.Eof do
begin
aEstoqueLote := TEstoqueLote.Create;
lista.Add(aEstoqueLote);
if UniQuery.FindField('idestoquelote') <> nil then
lista.Items[lista.Count - 1].idestoquelote := UniQuery.FieldByName('idestoquelote').AsInteger;
if UniQuery.FindField('idestoque') <> nil then
lista.Items[lista.Count - 1].idestoque := UniQuery.FieldByName('idestoque').AsInteger;
if UniQuery.FindField('idproduto') <> nil then
lista.Items[lista.Count - 1].idproduto := UniQuery.FieldByName('idproduto').AsInteger;
if UniQuery.FindField('idwmsmovimentoitem') <> nil then
lista.Items[lista.Count - 1].idwmsmovimentoitem := UniQuery.FieldByName('idwmsmovimentoitem').AsInteger;
if UniQuery.FindField('idwmsunidadearmazenagem') <> nil then
lista.Items[lista.Count - 1].idwmsunidadearmazenagem := UniQuery.FieldByName('idwmsunidadearmazenagem').AsInteger;
if UniQuery.FindField('ddatavalidade') <> nil then
lista.Items[lista.Count - 1].ddatavalidade := UniQuery.FieldByName('ddatavalidade').AsDateTime;
if UniQuery.FindField('ddatafabricacao') <> nil then
lista.Items[lista.Count - 1].ddatafabricacao := UniQuery.FieldByName('ddatafabricacao').AsDateTime;
if UniQuery.FindField('nquantidade') <> nil then
lista.Items[lista.Count - 1].nquantidade := UniQuery.FieldByName('nquantidade').AsExtended;
if UniQuery.FindField('npesoliquido') <> nil then
lista.Items[lista.Count - 1].npesoliquido := UniQuery.FieldByName('npesoliquido').AsExtended;
if UniQuery.FindField('npesobruto') <> nil then
lista.Items[lista.Count - 1].npesobruto := UniQuery.FieldByName('npesobruto').AsExtended;
if UniQuery.FindField('nvolume') <> nil then
lista.Items[lista.Count - 1].nvolume := UniQuery.FieldByName('nvolume').AsExtended;
if UniQuery.FindField('ssituacao') <> nil then
lista.Items[lista.Count - 1].ssituacao := UniQuery.FieldByName('ssituacao').AsString;
uniQuery.Next;
end;
end;
ThreadSql.Synchronize(nil, procedure
begin
FrmLoading.Release;
FreeAndNil(FrmLoading);
end);
end);
ThreadSql.Start;
Result := lista;
except on e: exception do
begin
TFrmTipoAviso.Mensagem('Tabela EstoqueLote : '+MensagemErroBanco(E.Message),'E',[mb_OK]);
end;
end;
end;
How do you feel about using mutex or semaphore?
– Leonardo Getulio
@Leonardogetulio, are third party components for Delphi?
– Jd3 Tecnologia
No, no. They’re all built-in. I’ll send you some links.
– Leonardo Getulio