推 LPH66: 你的觀念放錯邊了; 程式只有一份但跑它的人可以有很多個 11/05 00:55
→ LPH66: 你需要的是多執行緒 (multithread) 11/05 00:55
感謝您的指點,但我有點不太明白您的意思。
您的意思是說開MultiThread各自去load這個dll嗎?
我對dll不是很懂,用不同的Thread去load同一個dll,記憶體位置會不一樣嗎?
謝謝您的指點!
※ 編輯: Keitaro (111.251.208.202), 11/05/2015 01:57:07
推 LPH66: 所以我說你的觀念放錯邊了...一支程式要給許多人執行 11/05 02:16
→ LPH66: 並不代表程式就必須放在不同的位置 11/05 02:16
→ LPH66: 只要各人各自暫存的東西有分開即可, 程式本身可以只有一份 11/05 02:17
→ LPH66: 這正是多執行緒背後的觀念 11/05 02:19
→ LPH66: 也就是說, 你載入一次程式之後各個執行緒去執行它就可以了 11/05 02:19
→ LPH66: 這不論你的程式是不是 dll 都是一樣的 11/05 02:19
→ LPH66: 若你對多執行緒有點概念那應該能了解你的問題其實不是問題 11/05 02:21
→ LPH66: 因為有沒有使用 dll 的差別只在程式是從哪裡載入的而已 11/05 02:22
→ LPH66: 其他概念是相通的 11/05 02:23
您的意思是說我Load dll後儲存一個變數起來,
然後利用這個變數,開MultiThread去呼叫dll的function是嗎?
但我這dll問題在於,
dll跟Server建立連線後的變數是寫死一個global變數(存在dll裡面)。
這個變數代表跟server連線的Socket。
即使我開MultiThread去對這個dll做存取,
Socket是同一台NVR,這樣做不到Multi-Server的目的了。
再不改動dll的前提下,有更好的作法嗎?
謝謝!
※ 編輯: Keitaro (111.251.218.8), 11/05/2015 06:15:05
推 stupid0319: 寫成個別的獨立程式,然後再寫個介面整合就可以了 11/05 08:11
推 LPH66: 所以問題其實是在全域變數, 那這樣沒救, 你大概得改 dll 了 11/05 17:23
→ LPH66: 有全域變數的程式基本上不改寫沒什麼可能跑多執行緒 11/05 17:24
→ LPH66: 你可以搜尋一下 thread-safe 這個名詞 11/05 17:25
推 LPH66: 唔嗯, 回頭看了一下我樓上的推文, 那種做法也是可行 11/05 21:33
→ LPH66: (有點像 Google Chrome 背後運作的方式這樣) 11/05 21:33
→ LPH66: 這樣其實就不是 multi-thread 而是 multi-process 了 11/05 21:34
非常感謝以上兩位的建言。
今天跟BOSS討論了一下,如果直接改dll我有把握改的出來。
Multi-Process確實可以不改動dll的前提下達成我要的目的,
但是Multi-Process的溝通上我完全沒經驗...由於有deadline限制,我認命直接改dll了...
找時間在來學習一下Multi-Process的作法。
謝謝!
※ 編輯: Keitaro (111.251.218.8), 11/05/2015 21:38:21
→ LPH66: 這樣一來因為是 process, 資料空間確實各自獨立 11/05 21:36
→ LPH66: 各支子 process 會各有自己的那一份 global variable 11/05 21:37
→ LPH66: 這樣就能達成你的目的了 11/05 21:37
推 Killercat: global轉成一份可以duplicate的context即可 11/06 09:13
→ Killercat: 這算是改寫舊專案裡面前三名惱人的問題之一了.... 11/06 09:14
→ Killercat: 「三小,DLL裡面綁一堆global跟extern!」 11/06 09:14
推 EdisonX: 我想知道殺人貓的前三名是什麼 11/06 21:45
推 BlazarArc: 樓上+1 XD 11/06 23:13