gpt4 book ai didi

multithreading - 德尔福: How to create and use Thread locally?

转载 作者:行者123 更新时间:2023-12-03 15:20:57 25 4
gpt4 key购买 nike

我的数据库位于 VPS 中,我应该从我的表中获取一些查询

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

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

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

我的意思是:

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;

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

这可能吗?!

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

  • 我使用的是 Delphi XE6

最佳答案

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

procedure Requery;
var
...
begin
...
// run query
// do next jobs with query
...
end;

话虽如此,由于您使用的是 XE6,因此您可以使用 TThread.CreateAnonymousThread() 创建一个“本地”线程。方法,指定 anonymous procedure “捕获”您希望它使用的变量,例如:

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;

或者:

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

// Do next jobs with query
...
end;

但是,当您在执行其他操作时让它在后台运行,然后在线程完成其工作时执行操作,则线程会更有用。例如:

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;

关于multithreading - 德尔福: How to create and use Thread locally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32679222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com