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