DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 13
在线用户: 27
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/3/4 1:04:16
标题:
Android 下多线程的问题 浏览:742
加入我的收藏
楼主: //百度上找到的:
          if Assigned(Mythreadtask) then
          begin
          if Mythreadtask.Status = TTaskStatus.Running then
          begin
          //If it is already running don't start it again
          Exit;
          end;
          end;
          Mythreadtask := TTask.Create (procedure ()
          begin
          ClientModule1.Fc_Server_SM_FmClient.RemoPrint(billvchcode);
          end);
          Mythreadtask.Start;
  对于App 执行时间较长的任务总是闪退的情况,的确有帮助,
但是我是想请教一下:
多线程只需要.start,不需要释放?
请给一些关于Android 下多线程的讲解,谢谢!!!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/3/4 2:33:16
1楼: TTask ---> System.Threading.pas

TTask = class(TAbstractTask, TThreadPool.IThreadPoolWorkItem, ITask, TAbstractTask.IInternalTask)

it's a "Interface"... then, the free is not used here!  

if you needs more control about creating, try some like this:   + / - this way

var
  MyTasks : TArray<ITask>; // = array of ITask;  // dynamic array

....

procedure xxxCreating_My_Tasks;
  // creating 3 Tasks...
  //
  if not xxxMyTaks_Is_Running then
     MyTasks := []; 
  //
  MyTasks := MyTasks + [   TTask.Create(...)  ]; // MyTasks[ n+1 ]
  MyTasks := MyTasks + [   TTask.Create(...)  ]; // MyTasks[ n+2 ]
  MyTasks := MyTasks + [   TTask.Create(...)  ]; // MyTasks[ n+3 ]
end;

procedure xxxRun_My_Tasks;
begin
  TTask.Run( { each task on parallel way... out main-thread }
    procedure
    begin
      for var T in MyTasks do
        if (T<>nil) and not(T.Status = TTaskStatus.Running {...}) then  
          T.start; // running all...
    end);
end;

function xxxMyTaks_Is_Running:boolean;
begin
  result := false;
  //
  // TTaskStatus.Running, TTaskStatus.WaitingForRun, etc....
  //
  for var T in MyTasks do 
     if (T<>nil) and (T.Status = TTaskStatus.Running {...}) then  
       exit( true ); // some is running? 
end;

procedure xxxMy_Tasks_Is_Running_Try_Cancel;
var
  i,x:integer;
begin
   i := length( MyTasks );
   x := 0;
   //
   for var T in MyTasks do
   begin
     if (T<>nil) and (T.Status = TTaskStatus.Running {...}) then
     begin
        T.Cancel; // take a delay time to cancel it... it's not security here!!!! it can fail...
        x := x + 1;
     end;
   end;
   //
   sleep( 100 ); // a time...
   //
   if (i > 0) and (x = i) then
     MyTasks := [];
end;
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/3/4 3:01:32
2楼: 对于 Delphi 来说,安卓底下的多线程,和 WINDOWS 底下的多线程,写法一样。

我理解你的意思是指,安卓下执行时间长的任务,如果放在主线程里面执行,程序会闪退。

关于这个问题,我在其它帖子底下有写。原因是主线程如果被阻塞,在 windows 底下仅仅是程序界面冻结没反应,给用户感觉好像是死机了,感觉不好。同样的效果,在安卓底下,安卓系统会把 APP 杀死,大概是因为系统避免给用户一个不好的死机的现象。

当然,不管是安卓还是 WINDOWS,即便 WINDOWS 不会杀死主线程被阻塞的程序,也尽量不要这样干,毕竟给使用者的感觉不好。

因此,执行时间长或者阻塞的任务,放到线程里面去做比较好。

至于 Delphi 的多线程的写法,有很多种。你抄来的代码,看起来没头没尾的,不知道他为啥要这样写。反正我没用这样写过。

我的一个 APP 里面可能有5到10个线程,在安卓和 iOS 上都运行良好。

如果你仅仅是简单的把一个耗时任务丢进线程去执行,简单的使用 TTask.Run 这个方法就可以了。

我有篇博客文章专门讲了这个,里面有使用 TTask.Run 的例子代码:

https://blog.csdn.net/pcplayer/article/details/126427519
----------------------------------------------
-
作者:
男 sxfgf (FC_FGF) ★☆☆☆☆ -
普通会员
2023/3/4 9:03:14
3楼: emailx45,pcplayer
谢谢,两位!
----------------------------------------------
偶尔做做代码应付一下工作,却发现Delphi已成必配
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行66.40625毫秒 RSS