- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不知道如何在 Delphi 中正确使用 TTask。
我创建了一个 TTask。
syncTask := ttask.Create(SyncMysqlDatabase);
以下代码在onlocationchangevent(位置传感器)中。每次触发 onlocationchangevent 时运行此代码:
if (syncTask.Status <> ttaskstatus.Running) then
begin
logi('syncTask.Start');
syncTask.Start;
end;
但是当我再次尝试重新开始(完成后)任务时,出现以下异常:
Cannot start a task that has already completed
有人可以帮我吗?为什么?
最佳答案
您需要创建一个 ITask 变量并将您的 TTask 分配给它。
然后您可以等待任务完成,然后再次实例化它
像这样:
private
aTask: TTask;
...
Procedure LocationChanged;
begin
if Assigned(aTask) then
begin
while not TTask.WaitForAll([aTask], 10000) do
break;
end;
aTask := TTask.Run(procedure()
begin
// Do Your Stuff
end);
end;
我不确定我的 Assigned(aTask) 代码是否有效,但基本上只是检查 aTask 是否有分配给它的任务
因为它看起来像你在做一个 android 服务,我猜你并不太在意“挂起”主线程 - 这个代码 fragment 可以做到这一点
关于android - Delphi TTask 安卓服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37684927/
单击按钮后,我创建 3 个任务,每个任务都有空过程,并将方法调用和任务列表完成的时间差写入控制台: procedure TWinTest.BtnThreadTestClick(Sender: TObj
根据我阅读 Nick Hodges 的理解,这段代码应该没问题: TTask.Run( procedure var resp, tmp: string; req: boolea
专家,请看下面的代码片段: var aAllTasks : Array [0..1] of ITask //global private var Procedure SetImage(); be
我不知道如何在 Delphi 中正确使用 TTask。 我创建了一个 TTask。 syncTask := ttask.Create(SyncMysqlDatabase); 以下代码在onlocati
我对线程的经验有限。我想并行读取一些基本的数据库表,我需要等到所有表都读取完,程序才能合理地进行。在这方面,阻塞主线程对我来说没问题。 此代码(简化版)工作正常: procedure ReadDBMu
我有以下两种多线程代码方法来完成相同的工作。 任务: const MaxThreadCount = 80; procedure TWorkerTask.Update; var aTasks
Delphi 中的匿名方法创建一个闭包,该闭包在上下文中保持“包围”局部变量,直到匿名方法完成。如果使用接口(interface)变量,那么它们将在匿名方法完成之前减少其引用的实例。到目前为止一切顺利
背景 使用 TThread.CreateANonymousThread(aProc:TProc)我可以创建一个线程,在线程终止后销毁线程对象。 (或者将 FreeOnTerminate 设置为 tru
这是我在 DLL 中的代码: procedure TTaskTest; begin TTask.Run( procedure begin Sleep(300);
我是一名优秀的程序员,十分优秀!