作者aureolus (Aureo)
看板MacDev
标题[问题] MacOS下开发用NSThread程式忙碌问题
时间Mon Mar 7 14:57:48 2016
大家好,最近在MAC OS下开发一个检测机器用的软体
用一个按钮跑for回圈使用
[NSThread sleepForTimeInterval:0.5];
的语法去让程式重复Loop达成预期的结果
但有个问题是当按钮按下执行时鼠标会变成busy转圈中
直到回圈跑完显示结果後才能继续动作我的程式
没办法在执行该功能时中断我的动作或是点选其他按钮
请问一下有没有什麽办法能在程式执行回圈中让我能够进行其他动作
例如点选停止目前动作的按钮之类的....谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.134.2
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MacDev/M.1457333870.A.79C.html
1F:推 Blueshiva: 你应该是开个thread去跑回圈,不是在回圈中跑thread 03/07 15:39
2F:→ yuanruo: 因为你叫main thread 睡觉了,所以把UI线程卡住了 03/07 21:18
谢谢解惑 现在改用
t1 = [[NSThread alloc]initWithTarget:self selector:@selector(Method) object:nil];
[t1 start];
写在一个Button下面,然後想用另一个Button去停止Thread却停止不下来
我另一个Button下是写
[t1 cancel];
但是按下去後没有任何反应,回圈持续执行中
请问该怎麽做才能达成停止该selector的效果呢?谢谢!
※ 编辑: aureolus (60.248.134.2), 03/08/2016 11:42:06
3F:→ yuanruo: NSThread的cancel只是设一个flag 并不会马上取消已执行的 03/08 12:24
4F:→ yuanruo: 你需要在main thread中看thread的isCancel属性 用exit 03/08 12:25
5F:→ yuanruo: 不然嫌麻烦直接执行exit 也行 03/08 12:29
6F:推 Blueshiva: 应该不是在main thread,而是t1中看并exit吧 @.@ 03/08 12:57
诚心感谢各位的帮忙,已经顺利解决了问题
就诚如各位所说再用些判断式去exit目前执行中的thread
换个方向想後就成功解决了问题,谢谢帮忙!
※ 编辑: aureolus (60.248.134.2), 03/08/2016 14:29:09
7F:→ yuanruo: 如果没用property存thread 那在t1中取得currentThread 03/08 15:23
8F:→ yuanruo: 再exit, 有存起来我觉得哪个thread都能exit 吧(?) 03/08 15:24
9F:→ yuanruo: 打错 不是在t1中是执行thread的method中当前thread exit 03/08 15:25
10F:推 Blueshiva: 问题是你在main thread中exit会把main thread结束掉 XD 03/08 15:42
11F:→ Blueshiva: 反正要搞清楚自己要把哪个thread停掉就是了啦~ 03/08 15:43
我是设定一个变数去判断有没有按下停止Button
如果有直接break检测的回圈 所以实际说起来并没有停止Thread
功能上是实现了 但是实际上Thread还在跑 只是没有判断我要的东西而已
结果而言是成功的...我在找时间去研究这个区块好了 谢谢两位的帮忙!
※ 编辑: aureolus (60.248.134.2), 03/08/2016 16:46:46
12F:→ yuanruo: 喔 我那样打是他有用t1存起来 当然是在main看t1.isCancel 03/08 17:09
13F:推 Blueshiva: +exit: Terminates the current thread. 所以应该还是 03/09 11:33
14F:→ Blueshiva: 要在t1中呼叫才对,而且exit是个class method,不能针 03/09 11:33
15F:→ Blueshiva: 对某个instance呼叫 03/09 11:34