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类是不可能的,我应该使用其他线程技术......
你所描述的并不是线程的最佳用途.调用代码被阻塞,直到线程完成.这完全否定了并行运行代码的使用.您可以直接执行查询:
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)
| 归档时间: |
|
| 查看次数: |
7064 次 |
| 最近记录: |