Delphi:如何在本地创建和使用Thread?

G3n*_*Man 4 delphi multithreading

我的数据库在VPS中,我应该从我的表中获得一些查询

因为从服务器获取查询需要很长时间(取决于Internet速度!),我想使用线程来获取查询

现在我创建一个线程并获取查询,然后通过发送和处理消息将结果发送到我的表单

我想知道是否可以在本地创建和使用线程?!?

我的意思是:

procedure Requery;
var
 ...
begin
 Create Thread;
 ...

 Pass my Query Component to Thread
 ...

 Getting Query in Thread;
 ...

 Terminate and Free Thread
 ...

 Do next jobs with Query;
 ...

end;
Run Code Online (Sandbox Code Playgroud)

主要部分是最后一部分(做下一个工作......),我不想在消息处理程序中使用查询结果,我想在同一个程序和线程作业后使用它们

可能吗 ?!

我认为使用Delphi TThread类是不可能的,我应该使用其他线程技术......

  • 我正在使用Delphi XE6

Rem*_*eau 9

你所描述的并不是线程的最佳用途.调用代码被阻塞,直到线程完成.这完全否定了并行运行代码的使用.您可以直接执行查询:

procedure Requery;
var
  ...
begin
  ...
  // run query
  // do next jobs with query
  ...
end;
Run Code Online (Sandbox Code Playgroud)

话虽如此,由于您使用的是XE6,您可以使用该TThread.CreateAnonymousThread()方法创建一个"本地"线程,指定一个"捕获"您希望它使用的变量的匿名过程:

procedure Requery;
var
  Event: TEvent;
  H: THandle;
begin
  Event := TEvent.Create;
  try
    TThread.CreateAnonymousThread(
      procedure
      begin
        try
          // run query in thread
        finally
          Event.SetEvent;
        end;
      end
    ).Start;
    H := Event.Handle;
    while MsgWaitForMultipleObjects(1, H, False, INFINITE, QS_ALLINPUT) = (WAIT_OBJECT_0+1) do
      Application.ProcessMessages;
  finally
    Event.Free;
  end;

  // Do next jobs with query
  ...
end;
Run Code Online (Sandbox Code Playgroud)

线程仅在您在执行其他操作时让它在后台运行时才有用,然后在线程完成其工作时执行操作.例如:

procedure TMyForm.Requery;
var
  Thread: TThread;
begin
  Thread := TThread.CreateAnonymousThread(
    procedure
    begin
      // run query in thread
    end
  );
  Thread.OnTerminate := QueryFinished;
  Thread.Start;
end;

procedure TMyForm.QueryFinished(Sender: TObject)
begin
  if TThread(Sender).FatalException <> nil then
  begin
    // something went wrong
    Exit;
  end;
  // Do next jobs with query
end;
Run Code Online (Sandbox Code Playgroud)