推 Litfal: 你是要做到reentrace還是thread safe? 這裡應該很少在討論 04/07 22:31
→ Litfal: reentrant的,你也應該不是遇到這個問題吧 04/07 22:31
當只有call Sleep()時Console log就很標準一進一出沒有reentrance
>>>
<<<
>>>
<<<
>>>
<<<
...
但是當call了ddeClient.Request之後console log就變成
>>>
<<<
>>>
>>>
>>>
<<<
<<<
<<<
...
然後程式就很容易exception
就當在ddeClient.Request那一行
我想只要能解決reentrance的問題應該就不會當掉
※ 編輯: zaqimon (219.91.9.86 臺灣), 04/08/2020 00:06:04
→ ssccg: 不懂為什麼這種程式會想要做到一進一出? 除非預期只有一個 04/08 09:29
→ ssccg: client,不然這樣效能不會很差嗎? 04/08 09:29
→ ssccg: 通常只會想做thread safe,結果對就好執行順序不重要吧 04/08 09:35
→ ssccg: 至於會有exception那應該是要去研究到底為什麼有exception 04/08 09:35
推 Litfal: 高階語言不在意reentrance,你講這個字還沒什麼人懂。很多 04/08 19:39
→ Litfal: 人連interrupt都不知道也能寫一手好程式。你的問題應該是t 04/08 19:39
→ Litfal: hread safe 04/08 19:39
推 Litfal: 你用lock擋不住也不正常,先確定寫法吧 04/08 19:43
因為每次OnRequest都是從DDEML callback過來的
都屬於同一個thread
lock好像只能擋住不同thread的樣子吧
所以檔不住是正常的
https://github.com/anphonic/NDde/
應該說我不知道如何正確使用NDDE才能把DDE client/server寫在同一支程式裡面
大部分的使用情況不會需要把DDE client/server寫在同一支程式
而且我的client/server之間還要呼叫到彼此的method
可能因此導致NDDE元件內部狀態混亂吧
雖然NDDE有source code但我也看不懂
根據我簡單測試
正常狀態下DDE server的OnRequest不應該發生reentrance
但只要OnReuest內去呼叫到DdeClient.Request就會導致reentrance
然後就很容易exception
接下來我可能改用C# winform寫寫看
我好像有看到NDDE source code有建立隱藏視窗來處理window message
也許是console程式對thread或window message過敏吧
但NDDE給的sample程式又只是console而已
※ 編輯: zaqimon (219.91.9.86 臺灣), 04/08/2020 23:30:31
推 Litfal: console那行把thread id也印出來看看是不是真的在同一個執 04/09 14:25
→ Litfal: 行緒下吧,是的話應該是client.Request又呼叫進入了server 04/09 14:25
→ Litfal: .OnRequest,你要想想這是不是合理的行為 04/09 14:25
→ Litfal: 我的話會用BlockQueue把server和client隔離 04/09 14:26
有測試過不論DdeServer跟DdeClient的ManagedThreadId是否相同
都會發生這個reentrance的問題
可能當初NDDE作者沒有想到有人會需要把DdeServer跟DdeClient放在一起吧
※ 編輯: zaqimon (219.91.9.86 臺灣), 04/10/2020 00:52:34