aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 9456|回复: 16

为什么关闭程序后,任务管理其中进程还在运行

[复制链接]

16

主题

70

回帖

504

积分

三级会员

积分
504
QQ
发表于 2018-5-5 19:57:33 | 显示全部楼层 |阅读模式
各位老师:
一个小程序,为什么点击窗口的“X”之后,任务管理器中还有进程在运行,而且,这个循环动作还在继续,除非在任务管理器中结束进程才行。
  1. import win.ui;
  2. import mouse;
  3. /*DSG{{*/
  4. mainForm = win.form(text="aardio form";right=499;bottom=399)
  5. mainForm.add(
  6. button={cls="button";text="开始循环按下载按钮";left=152;top=173;right=396;bottom=229;font=LOGFONT(h=-16);z=1}
  7. )
  8. /*}}*/

  9. mainForm.button.oncommand = function(id,event){
  10. var countLoop = 0
  11. while( countLoop<1000 /*这里指定进入并重复执行循环语句的条件*/ ){
  12.         countLoop++
  13.         sleep(10000);
  14. mouse.click(391,137,true);

  15. };        
  16.        
  17.        
  18. }

  19. mainForm.enableDpiScaling();
  20. mainForm.show(true);


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

12

主题

40

回帖

424

积分

二级会员

积分
424
发表于 2018-5-5 23:23:04 | 显示全部楼层
窗口关闭了,但循环还在继续
加个判断if(!win.delay()) break跳出循环就行了

16

主题

70

回帖

504

积分

三级会员

积分
504
QQ
 楼主| 发表于 2018-5-6 15:47:27 | 显示全部楼层
iaauto 发表于 2018-5-5 23:23
窗口关闭了,但循环还在继续
加个判断if(!win.delay()) break跳出循环就行了

谢谢老师指导,加了您的这句代码,可以解决了。
我还有个问题,能否通过添加一个释放内存的代码呢?
这种释放内存的代码,是什么?搜了一下论坛及帮助文档,没有看到关于释放内存的帮助。

4

主题

45

回帖

733

积分

三级会员

积分
733
发表于 2018-5-6 16:02:33 | 显示全部楼层
本帖最后由 我心飞翔1995 于 2018-5-6 16:06 编辑
ycdb 发表于 2018-5-6 15:48
谢谢老师指导,加了您的这句代码,可以解决了。
我还有个问题,能否通过添加一个释放内存的代码呢?
这 ...


IDE里面的语法选项,有内存回收的函数,或者你自己输入 collectgarbage( 会自动跳出语法提示。
论坛里面并不是没有,v10 string.random的内存回收问题 -
http://bbs.aardio.com/forum.php? ... A%B4%E6%BB%D8%CA%D5
这就是我搜到的,里面用到了内存回收的语句,你没有仔细看。

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2018-5-6 16:05:25 | 显示全部楼层
ycdb 发表于 2018-5-6 15:47
谢谢老师指导,加了您的这句代码,可以解决了。
我还有个问题,能否通过添加一个释放内存的代码呢?
这 ...
aardio是自动管理内存的编程语言,
如果你需要自己手动管理内存,建议改用C语言、C++、或者汇编语言之类。
aardio也提供 raw.realloc 可以手动分配释放内存,但一般不建议使用,因为自己管理内存很容易出错。

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2018-5-6 16:40:56 | 显示全部楼层
我心飞翔1995 发表于 2018-5-6 16:02
IDE里面的语法选项,有内存回收的函数,或者你自己输入 collectgarbage( 会自动跳出语法提示。
论坛里 ...
collectgarbage 函数不需要去调用,一般的程序都用不到。

如果写出来的代码都是死循环,再怎么collectgarbage都没有用。如果代码写的没有问题,自然也就不需要 collectgarbage

16

主题

70

回帖

504

积分

三级会员

积分
504
QQ
 楼主| 发表于 2018-5-6 17:18:38 | 显示全部楼层
Jacen.He 发表于 2018-5-6 16:40
collectgarbage 函数不需要去调用,一般的程序都用不到。

如果写出来的代码都是死循环,再怎么collectga ...

嗯,我想这个确实是死循环,由于水平有限,就是想实现一个,程序自动点击屏幕中的一个位置。

16

主题

70

回帖

504

积分

三级会员

积分
504
QQ
 楼主| 发表于 2018-5-6 17:21:31 | 显示全部楼层
我心飞翔1995 发表于 2018-5-6 16:02
IDE里面的语法选项,有内存回收的函数,或者你自己输入 collectgarbage( 会自动跳出语法提示。
论坛里 ...

谢谢您的回复,可能还是我的表达有问题。我想做的就是,当我关闭程序时,任务管理器中的进程也同时关闭了。

12

主题

40

回帖

424

积分

二级会员

积分
424
发表于 2018-5-6 17:48:11 | 显示全部楼层
ycdb 发表于 2018-5-6 17:21
谢谢您的回复,可能还是我的表达有问题。我想做的就是,当我关闭程序时,任务管理器中的进程也同时关闭了 ...

mainForm.onClose = function(hwnd,message,wParam,lParam){
    ::Kernel32.ExitProcess(0)
}

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2018-5-6 18:07:26 | 显示全部楼层
iaauto 发表于 2018-5-6 17:48
mainForm.onClose = function(hwnd,message,wParam,lParam){
    ::Kernel32.ExitProcess(0)
}

这样写代码是错的,
相当于一个人下班了,不知道怎么回家,
于是你告诉他,对自己捅一刀就行了。

12

主题

40

回帖

424

积分

二级会员

积分
424
发表于 2018-5-6 18:19:25 | 显示全部楼层
Jacen.He 发表于 2018-5-6 18:07
这样写代码是错的,
相当于一个人下班了,不知道怎么回家,
于是你告诉他,对自己捅一刀就行了。

这倒没考虑到,以前写循环时不知道怎么结束就用的这个
反正是想程序死,直接来个快的

12

主题

40

回帖

424

积分

二级会员

积分
424
发表于 2018-5-6 18:22:36 | 显示全部楼层
Jacen.He 发表于 2018-5-6 18:07
这样写代码是错的,
相当于一个人下班了,不知道怎么回家,
于是你告诉他,对自己捅一刀就行了。

有时候经常在循环里或者子线程里循环忘了写判断导致窗口关闭了程序还执行,所以就用这种方式结束进程

不过不知道会有隐患

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2018-5-6 18:38:25 | 显示全部楼层
ycdb 发表于 2018-5-6 17:21
谢谢您的回复,可能还是我的表达有问题。我想做的就是,当我关闭程序时,任务管理器中的进程也同时关闭了 ...

你的程序关闭了,
任务管理器的进程当然会同时关闭。

如果你的窗口关闭就是退出程序,
那么,你在窗口关闭后代码就不应当继续运行

aardio并不会帮你决定这些事,因为你的需求并不是其他人的需求。
窗口关闭了,程序当然是可以继续运行的。例如你可能在关闭窗口以后,后台需要做一些其他的事情。甚至有的软件根本就不需要窗口。如果这时候没有经过你同意,直接把你的进程杀了,这时候你可能又要纠结别人为什么没经过你的同意,就把你的进程杀了

写代码以前,先去看一下开始页的入门必读教程,了解一些基础的编程知识。
例如你的代码,很多低级错误,这些都是入门教程中有讲到的东西,例如面线程不能用 sleep,不能写耗时循环,你全都是跟教程反过来的。。。。。。

例如你的程序,耗时循环放到工作线程里就可以了:
import win.ui;
/*DSG{{*/
mainForm = win.form(text=
"aardio form";right=499;bottom=399)
mainForm.add(
button={cls=
"button";text="开始循环";left=152;top=173;right=396;bottom=229;z=1}
)
/*}}*/

mainForm.button.oncommand =
function(id,event){
   
   
//创建后台线程循环
    thread.invoke(
        
function(){
            
import mouse;   
            
var countLoop = 0
            
while( countLoop<1000 ){
                countLoop++
               
sleep(10000);
            };
        }
    )
}

mainForm.show();
win.loopMessage();

用界面定时器做循环也可以:
import win.ui;
/*DSG{{*/
mainForm = win.form(text=
"aardio form";right=499;bottom=399)
mainForm.add(
button={cls=
"button";text="开始循环";left=152;top=173;right=396;bottom=229;z=1}
)
/*}}*/

mainForm.button.oncommand =
function(id,event){
   
   
var countLoop = 0
   mainForm.setInterval(
        1000,
function(hwnd,msg,id,tick){
            countLoop ++;
            
if(countLoop < 1000 ) return 0;//停止循环
        }
    )
}

mainForm.show();
win.loopMessage();

把你代码中的sleep简单的换成 win.delay 也可以
import win.ui;
/*DSG{{*/
mainForm = win.form(text=
"aardio form";right=499;bottom=399)
mainForm.add(
button={cls=
"button";text="开始循环";left=152;top=173;right=396;bottom=229;z=1}
)
/*}}*/

mainForm.button.oncommand =
function(id,event){
   
   
var countLoop = 0
   
while( countLoop<1000 ){
        countLoop++
        
if( !win.delay(10000) ) break ;
    };
}

mainForm.show();
win.loopMessage();
解决的方法有很多,教程、范例、文档里里都写了这些东西。





16

主题

70

回帖

504

积分

三级会员

积分
504
QQ
 楼主| 发表于 2018-5-8 03:45:22 | 显示全部楼层
Jacen.He 发表于 2018-5-6 18:38
你的程序关闭了,
任务管理器的进程当然会同时关闭。

谢谢Jacen,不厌其烦的点拨。确实是应该系统的学习研究一下aardio编程了。让您见笑了,虽然这个小程序错误挺多的,但是aardio确实是帮助了这个门外汉,实现了我想实现的东西,不用我手动一次一次的去点了。
感谢Jacen,感谢aardio!
我再研究研究您提供的这段代码!

16

主题

70

回帖

504

积分

三级会员

积分
504
QQ
 楼主| 发表于 2018-5-8 03:52:38 | 显示全部楼层
iaauto 发表于 2018-5-6 18:19
这倒没考虑到,以前写循环时不知道怎么结束就用的这个
反正是想程序死,直接来个快的

您的方法,对我等小白来说,还是有实用价值的。
感觉自己编出全自动化的程序,比较困难了,能够半自动化,减少手动的工作量,我已经很满意了。

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2018-5-8 12:04:41 | 显示全部楼层
iaardio 发表于 2018-5-6 18:22
有时候经常在循环里或者子线程里循环忘了写判断导致窗口关闭了程序还执行,所以就用这种方式结束进程

...
上面我不用 ::Kernel32.ExitProcess(0)写的代码,并不比楼主的代码复杂,解决问题很简单。

::Kernel32.ExitProcess(0) 不能解决任何问题。主线程里耗时循环必须要写判断,像楼主那样,以为可以用 ::Kernel32.ExitProcess(0) 就能结束程序,然后就在界面线程里耗时循环了,sleep了,然后发现程序运行卡死了,可能又要纠结好多天了...........

而且程序退出前会做正常的清理退出操作,触发析构回收代码可以正常的清理资源,异常退出就可能会导致程序执行不正常。这个相当于电脑关机,这就好象有人说自己是“新手”不知道怎么正常关机,或者正常关机太复杂,于是每次用完电脑都直接拉断电源线。。。。。。,怎么说呢,你可能直接天天这样拉也没事。但关键是你没必要这么做,因为道理很简单,如果你连正常关机都学不会,你就根本不应该买电脑。

的确有一些已经开发好的现成的保姆式软件,能把所有的事都做好,每执行一句代码都要顺带执行一大堆的“保姆代码”以避免程序卡死不能退出。举个例子例如在浏览器里写Javascript脚本。浏览器软件是别人写好的,在浏览器里写Javascript脚本你根本不用懂什么界面线程、消息循环,当然你也不能用sleep函数,也没有多线程,更加也不可能 ::Kernel32.ExitProcess(0)  ......... 就算是你的程序崩溃了,浏览器都能及时的把进程干掉重新创建一个。

但如果希望自己写软件,而不是用别人写好的保姆式软件
如果希望自己创建界面线程,自己控制消息循环,能sleep,能多线程,能调用底层API.........,那么首先要耐心读一下 aardio 开始页的入门必读教程,至少学会怎么退出程序。

1

主题

3

回帖

37

积分

新手入门

积分
37
发表于 2018-5-11 22:00:50 | 显示全部楼层
哈哈哈,下班后捅自己一刀。。。Jacen也是段子手。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2023-3-28 14:16 , Processed in 0.061602 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

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