[問題] Socket send too fast & Timer overlap

作者: AizawaYuuiti ( )   2017-04-17 16:33:49
如題
兩個問題
1.Socket send too fast
之前問過有關Socket的問題
不過後來抓出問題好像不在Socket的Connected判斷身上
而是當Socket重複送太快的時候
會造成錯誤然後Socket就斷線了
目前如果要送訊息,會把訊息Queue在Arrary裡面
然後以100ms去跑一個Timer
OnTimer內再用While迴圈去把所有Array的訊息都送出去
但好像只要連續送幾個訊息就會當了
就算是一來一往,只要區網速度太快也會造成一樣問題
這時候該用什麼方法解決比較好?
原本是想說在送一個訊息之後Delay幾ms
或者直接將幾ms內呼叫的Send指令給pass掉
但這些都不是我要的
有沒有辦法以最安全的方法,讓訊息能以可能的最快時間全部發送出去?
2.Timer overlap
這是另一個問題
一個主Thread裡面以100ms跑Timer
OnTimer內用foreach跑所有子物件的OnTimer
然後子物件的OnTimer內才會去處理所有各自的事情
原先以為,統一由主Thread去呼叫,可以避免多執行緒的交錯問題
結果卻發現還是有交錯
後來查詢跟實驗的結果,發現是Timer的Overlap問題
也就是說在還沒完成所有子物件的OnTimer之前
100ms就到了所以呼叫第二次的主Thread的OnTimer
然後就跑出了意外的結果
搜尋的結果
嘗試使用lock跟timer.stop跟timer.start
的確讓交錯問題消失了
但產生另一個問題是
當子物件數量一多,整個OnTimer的迴圈就變慢很多
造成主Thread無法以100ms穩定的跑
雖然說要做的事應該是需要堆疊完成才對
但不知道有沒有辦法讓主Thread要做的事穩定進行
然後子物件的OnTimer判斷獨立出來延遲?
還是說這樣的想法有根本上的錯誤?
實際上應該是要把兩個Timer分開?
作者: AizawaYuuiti ( )   2017-04-17 18:04:00
好像找到一些關鍵字不用Send改用BeginSend,然後sendDone.WaitOne()Timer的部分還在思考...
作者: s89227 (Kei)   2017-04-17 19:39:00
callback?
作者: Litfal (Litfal)   2017-04-17 21:16:00
你把事情搞得好複雜,你到底想不想讓他們非同步(重疊)跑?
作者: AizawaYuuiti ( )   2017-04-17 22:40:00
現在想法也是有點混亂,有些要同步有些不同步的主要是主Thread想讓他保持100ms跑但如果裡面的子物件使用同步跑且順序等,數量一多就會超過100ms,而且越多越久。但使用非同步的時候,有些判斷式是需要偵測其他物件狀態的,然後就會發生兩邊同時修改同時判斷成功所以才會覺得非同步會造成一些問題。
作者: Litfal (Litfal)   2017-04-17 23:33:00
聽你的說法感覺你不應該用timer你看要不要再把問題描述的具體一點,主執行緒100ms是只負責啟動或加入工作(Task)嗎?目前看起來你的子工作各自有各自的timer在執行,不太能理解你為何要這樣做
作者: ssccg (23)   2017-04-18 14:14:00
例如說把訊息queue在array,然後排程去從array取出來這點就怪怪的,通常會直接放進一個BlockingQueue,然後一個thread固定從這個queue前端取東西一直送就好,沒東西自然會停著等要調頻率就動這thread沒有平行執行的問題你還是把需求講清楚一點,看有沒有從根本架構修改的方法
作者: jizang (阿魯米)   2017-04-18 22:09:00
Thread+同步, 或者單執行許+非同步
作者: jinmin88 (晝伏夜出)   2017-04-19 01:26:00
回2..在timer要做事情之前用lock(obj){}包住他第二次跑的時候如果發現還在lock..就會skip過去
作者: Litfal (Litfal)   2017-04-19 02:36:00
你什麼時候有Critical Section進不去就會被跳過的錯覺了
作者: jinmin88 (晝伏夜出)   2017-04-19 13:28:00
sorry想錯了,的確不會skip,剛查了可試Monitor.TryEnter
作者: AWEN221 (Larry)   2017-04-24 11:14:00
感覺你無法確認OnTimer時上一次TIMER的工作是否做完...

Links booklink

Contact Us: admin [ a t ] ucptt.com