PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] 如何设定时间上限使程式自动输出?
楼主:
BreathWay
(息尉)
2017-12-30 11:04:55
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
我写了一个以暴力算法求最佳解的程式,
主要是透过不断更新所找到的更好的解来达成。
但是我希望能设定一个时间上限,
如果程式还没跑完就直接输出目前找到的最好的解。
请问有办法在 C 里面实作这个功能吗?
作者:
loveflames
(咕啾咕啾魔法阵)
2017-12-30 11:19:00
SIGALRM
作者:
Hazukashiine
(私は幸せです)
2017-12-30 14:32:00
POSIX Thread 或是 Signal Handler像是可以 SIGINT 时印出 ex. ping
作者:
edisonhello
(edison)
2017-12-30 15:38:00
clock <ctime> 可以用
作者:
alan23273850
2017-12-30 16:04:00
透过signal是还不错的方法,不过如果不想碰系统底层的话其实我有另一个创意方法,你可以设一个全域变量纪录程式一开始的时间戳,之后在code会重复执行的地方插入查询当下时间戳的code,跟最一开始的全域变量相减,超过一定的值就代表跑太久,跳出循环即可这样副作用是会降低程式效率,112我觉得可以弄signa
作者:
b0920075
(Void)
2017-12-30 18:26:00
用signal算满简单的吧XDDD跟112有什么关系
作者: longlongint (华哥尔)
2017-12-30 18:45:00
直接看循环计数值最简单
作者:
Lipraxde
(Lipraxde)
2017-12-30 19:42:00
设个条件求到够好的解就跳出也不错啊
作者:
Hazukashiine
(私は幸せです)
2017-12-30 22:35:00
事实上你可以搭配 Linux 的 cron (job scheduler)来达成定时发送 SIGINT 的任务 不一定要人亲自去按
作者:
galic
(嘎利)
2017-12-30 23:01:00
Ctrl+C只是其中一种Signal(SIGINT)好吗 然后推文为何一直叫人家用SIGINT 明明就有timer用的signal你也只有polling counter或是透过timer两种作法但照po后来的回复 这种需求就是要走timer阿那就看一看timer的文件
https://tinyurl.com/lo9e3w3
https://tinyurl.com/d5fw2rh
作者:
Hazukashiine
(私は幸せです)
2017-12-30 23:40:00
用 SIGINT 是因为方便 弹性比较高 可以搭配脚本使用如果程式正在前景跑 但是手痒想在 timer expired前看偷看 按一下 ctrl + c 就可以了 如果想要静静放后景跑 就指令后面加 & 如果直接用楼上的方法写死在程式里编译好的话 就没有这种好处了 更何况楼主可能只是想偶尔偷看一下进度而已 我觉得用 SIGINT 合适
作者:
galic
(嘎利)
2017-12-30 23:49:00
不用帮别人脑补
作者:
Schottky
(顺风相送)
2017-12-31 05:22:00
要闹钟给一支市话的概念,也是能用但好像哪里不太对
作者:
Killercat
(杀人猫™)
2017-12-31 08:17:00
用chrono拿start time, 在loop里面每做完一次运算就再拿一次timer, 去相减看看到threshold没如果你对时间的精度要求不是特别高的话,这最简单外部用OS SDK/Signal去砍比较准 但是要依赖外部这前提是假设你的演算是不可中断的但是你说brute force, 单次演算应该都不会太长才是
作者:
alan23273850
2017-12-31 08:47:00
顺带提醒一下,最好测一下持续查询时间戳这个动作对效能的影响,这个有时候会超乎你想像,牵涉到systemcall的函式都要注意,通常时间比例是关键
作者:
GaliTW
(嘎嘎利)
2017-12-31 09:04:00
Linux有vDSO 不用担心
作者:
steve1012
(steve)
2017-12-31 10:21:00
感觉原 po只是要一个简单的方法可以停止而已xD 应该不用太精细?你也可以output 每 k个 iteration 后的解就好这样你想停就直接ctrl c
作者:
Killercat
(杀人猫™)
2017-12-31 10:43:00
alan倒是说到重点,要是每次运算都只有10几个clock那真的会造成很巨大的影响(这是绝对有可能的)
作者:
steve1012
(steve)
2017-12-31 10:43:00
可以每 k次 check 就好
作者:
Killercat
(杀人猫™)
2017-12-31 10:44:00
不过普通情况下 profiling一下 应该没问题就取简单的吧
作者:
jasonwu23
(jasonwu)
2017-12-31 17:23:00
他要时间到印解答呀 你ctrl c程式跳出来了还能印吗
作者:
Hazukashiine
(私は幸せです)
2017-12-31 17:26:00
可以 ctrl+c (SIGINT) 印出 ctrl+\ (SIGQUIT) 结束这些 signals 都是可以重载的 ><
作者:
Killercat
(杀人猫™)
2017-12-31 23:11:00
不过牵扯到kernel space的呼叫的话 记得sigint handler要做收尾动作,不然kernel state可能会出包比方说用ioctl设旗标等等动作都要小心点
作者:
y3k
(激流を制するは静水)
2016-01-01 11:23:00
用过SIGINT+1 XD
作者:
alan23273850
2016-01-01 14:39:00
上面steve大大也有提到一点,如果每次iter时间差不多的话,也可以用迭代次数取代时间,以省去系统呼叫
作者:
sunneo
(艾斯寇德)
2016-01-01 17:58:00
照其他语言的习惯是设cancellation token,并让你的算法改写成iterator,每个iteration都看时间。
作者:
x000032001
(版废了该走了)
2016-01-01 20:41:00
想要不影响效能吗 写个thread处理吧 (X
作者:
joe820730
(Let it go)
2016-01-01 21:46:00
是我的话会考虑写个thread计时...什么signal都不用处理
作者:
bben900911
(Ben)
2016-01-02 11:04:00
笨笨如我也会这样。 把最新结果放在全域或heap,另一个thread固定wait自己,起来后就去取值@@
作者:
Lipraxde
(Lipraxde)
2016-01-02 13:09:00
这样的话要注意互斥的问题呢
作者:
jimfan
(jimfan)
2016-01-03 09:59:00
赞同用signal最精简
继续阅读
[问题] Visual Studio 侦错有时会无法真错
yee232yee
[问题] linklist(无法执行)
eecheng87
Re: [问题] 透过dos传0给main的argv会被当作什么
jeromeshih
[问题] #define function 传 array
kkroy
[心得] 简介一下boost.preprocessor
loveflames
[问题] 透过dos传0给main的argv会被当作什么
jeromeshih
[问题] 请教传入日期+ms产生epoch时间
TwoDemon
[问题] git使用问题
s4300026
[问题] 关于sublime编译完之后执行跳出的视窗
ssd860505da
Visual Studio的反白问题
actf5795nb8
Links
booklink
Contact Us: admin [ a t ] ucptt.com