作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的数据库位于 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 类是不可能的,我应该使用其他线程技术......
最佳答案
您所描述的并不是线程的最佳用途。调用代码将被阻塞,直到线程完成。这根本就否定了并行运行代码的使用。您可以直接执行查询:
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/
我是一名优秀的程序员,十分优秀!