搜索
aardio官方社区 门户 查看主题

关于线程怎样才能让界面不卡

发布者: abbasky | 发布时间: 2017-11-9 18:11| 查看数: 1021| 评论数: 16|帖子模式

  1. import win.ui;
  2. /*DSG{{*/
  3. mainForm = win.form(text="aardio form";right=759;bottom=469)
  4. mainForm.add(
  5. edit={cls="edit";left=14;top=246;right=743;bottom=455;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1}
  6. )
  7. /*}}*/
  8. import console;
  9. console.open();
  10. import thread.command;
  11. var listener = thread.command();
  12. listener.print = function( ... ){
  13.     //mainForm.edit.print( ... ) //将线程传过来的参数追加输出到文本框
  14.     console.log(...);
  15. }

  16. //创建工作线程,线程内错误信息默认输出到控制台
  17. thread.invoke(

  18.     function(hwnd){
  19.    
  20.         //必须在线程函数内部导入需要的库
  21.         import thread.command;
  22.         while(true){
  23.         //调用界面线程的命令
  24.                 thread.command.print("hello world",1,2,3);
  25.                
  26.                 //也可以用post方法异步调用线程命令,不会等待调用完成
  27.                 thread.command.post("print","hello world",1,2,3);
  28.         }
  29.     }
  30. );

  31. mainForm.enableDpiScaling();
  32. mainForm.show();

  33. return win.loopMessage();
复制代码


一般采样程序都会有循环采样,我在工作线程中加一个循环作试验,图形界面就很卡了,有没有什么办法让界面不卡?

最新评论

Jacen.He 发表于 2017-11-10 14:43:15
abbasky 发表于 2017-11-10 14:23
不过还有点疑问,我发命令不频繁时界面也卡的不行,代码如下:
thread.invoke(
    function(hwnd){

你的代码我实际测试了一下 - 是一点也不卡的,
所以你在论坛发的,就是这的问题,就是那的问题,缺乏认真的测试,属于随意的推测。

你可以测试一下aardio范例里的多线程的例子,有很多呀,
多线程你要搞的卡死,这真不是一般人能做到的,没有那么容易卡的。
检查下你自己是不是中病毒了啥的,别人跑几百个线程都没有卡死,你一个线程就卡死了,这是有多么的不容易。

while(true){   } 这种密集死循环是要避免的。

Jacen.He 发表于 2017-11-9 18:42:41
多线程本来就可以让界面不卡,

但是哪有人像你这样写的?!
这就好像老板给你们每个部门安排了工厂,安排了员工,让你们多线程各做各的事,但是你们上班不干活,不停的往公司总部打电话,从来不带停的,还怪电话老是占线。

界面线程不是同样的道理吗?!
你还 while(true) 不停的往界面线程发指令,不让界面线程有任何喘息的机会,还要怪他卡。

没卡死你的操作系统就谢天谢地了!
Jacen.He 发表于 2017-11-9 18:44:29
界面不需要这么频繁更新的,哪个的眼睛眨的这么快?!
abbasky 发表于 2017-11-9 20:28:03
本帖最后由 abbasky 于 2017-11-9 20:34 编辑

校长,那怎样才不给界面发指令,只是单纯的后台线程,只有在满足条件才给窗口发指令呢?
我看了threadCommand似乎也是界面有关的,threadInvoke似乎都与界面有关。
abbasky 发表于 2017-11-9 20:51:32
我的需求是这样,一个线程在后台循环采样硬件数据,当出现某些特征数据,则发送给界面显示。所以后台循环采样的的线程一定不能对界面产生影响才行。
xauto 发表于 2017-11-9 21:01:15
你采集的数据都是一次性用完就丢吗 你完全可以保存到数据库 然后让界面去读取
你这样一直发给界面 界面只顾着接受数据 哪里还有时间响应操作了!
Jacen.He 发表于 2017-11-9 22:49:56
abbasky 发表于 2017-11-9 20:28
校长,那怎样才不给界面发指令,只是单纯的后台线程,只有在满足条件才给窗口发指令呢?
我看了threadComm ...

你自己给界面发指令,
可是又在问怎样才不给界面发指令???? 听的一头雾水。

线程本来就跟界面没关系,thread.invoke跟界面也没有关系,
但是你用 thread.command 就是对界面发指令了。
Jacen.He 发表于 2017-11-9 22:56:28
用thread.command 是对界面发指令,
而工作线程并不需要太过频繁的去操作界面(更新界面这么快,人的眼睛眨不过来是无意义的)

可以修改代码不要频繁的给界面发指令,或者改用 thread.command.sendIdle thread.command.postIdle等函数,这几个函数会计算时差,丢弃一部分指令。

如果你不是用 thread.command 来刷新界面,而是用来调用函数,那要修改思路了,改用工作线程去做与界面无关的事情,用事件对象这些去同步。
abbasky 发表于 2017-11-10 14:02:39
感谢校长和苏的回复!我的理解如下,不知道正确了没有?

  1. thread.invoke(
  2.     function(hwnd){
  3.        import thread.command;
  4.             while(true){
  5.             //在这里做一些费时工作,但不发command给界面,这样就不会影响到界面了对吧?
  6.            }

  7.     }

复制代码
abbasky 发表于 2017-11-10 14:05:37
感谢校长和苏的回复!我的理解如下,不知道正确了没有?

  1. thread.invoke(
  2.     function(hwnd){
  3.        import thread.command;
  4.             while(true){
  5.             //在这里做一些费时工作,但不发command给界面,这样就不会影响到界面了对吧?
  6.            }

  7.     }

复制代码
Jacen.He 发表于 2017-11-10 14:07:33
abbasky 发表于 2017-11-10 14:05
感谢校长和苏的回复!我的理解如下,不知道正确了没有?

只有一半对,不频繁发消息给界面是对的,

但是你的线程也不要占用CPU太狠,如果一直在运算,加一些sleep函数,CPU占用率就会降下来,有时候不是界面卡的问题,可能是系统都卡死了。
abbasky 发表于 2017-11-10 14:14:27
console应该也是界面的一部分,我在里面直接执行console,界面也是卡的不行。实际上确实有循环采样这样的应用场景,采用苏的方法,感觉是需要有独立于界面程序的读写硬件数据的后台程序。
Jacen.He 发表于 2017-11-10 14:16:53
abbasky 发表于 2017-11-10 14:14
console应该也是界面的一部分,我在里面直接执行console,界面也是卡的不行。实际上确实有循环采样这样的应 ...

哪有在多线程操作控制台的,
控制台比任何东西都卡,这种东西只是范例用用,你实际开发软件,多线程你还用控制台,怎么想的呢。
Jacen.He 发表于 2017-11-10 14:18:43
资源总是有限的,
这种东西,你用单线程难道就不卡 - 那只能是更加卡,
这种问题,还是要自己解决,浪费资源不珍惜,别人怎么帮。
abbasky 发表于 2017-11-10 14:23:50
本帖最后由 abbasky 于 2017-11-10 14:27 编辑

不过还有点疑问,我发命令不频繁时界面也卡的不行,代码如下:
thread.invoke(
    function(hwnd){
       import thread.command;
       import console;
            while(true){
            }
           console.log("test"); //去掉这句就不卡界面了,按理这句从来就没有调用过啊
    }
幻月 发表于 2017-11-10 14:39:17
明知道不用还要加,楼主是猴子派来的逗逼么,也就作者有耐心答复你

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-6-23 19:40 , Processed in 0.062500 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表