發表文章

目前顯示的是 2013的文章

JAVA中Singleton模式實用案例

圖片
工作上為了實作銀行內部使用的存摺磁條讀寫器的程式,因此需要防範不同程式間搶資源的狀況。 架構為多台client連接到同一台server,server上連接一台共用的磁刷機,由同一程式做外部裝置的控管。 為了讓某項周邊裝置同時間只有一個instance可存取,利用Singleton模式可以達到此效果。 網路上的範例: class CommUtils{ //使用Singleton 模式使得一個類別只有能一個實例。用getInstance取得控制權 private static CommUtils instance = null; private CommUtils (){} public static CommUtils getInstance() { if (instance == null){ synchronized( CommUtils .class){ if(instance == null) { instance = new CommUtils (); } } } return instance; } ... } 這寫法,能夠給該物件使private static物件存在唯一的reference位置,此方式在同一個thread當中同時呼叫CommUtils,第一個thread順利取得instance,第二個thread則因為判斷出instance不為null的同一個物件,會回傳同一個instance。 但當不同的process執行時,則因為共用到同一個PORT而先出PortInUseException,不進入到此程式中。 事實上Synchronized內區塊在實測中無測試到。因此可用以下寫法簡化,不需要lazy initialization。 public class CLASS { static private CLASS obj= new CLASS(); private CLASS() { } static public CLASS getIn

用 C# 控制 Win7 輸入法

圖片
參考網址 - VISTA 與輸入法程式介面 文/黃忠成 http://www.dotblogs.com.tw/code6421/archive/2010/09/27/17909.aspx (感謝上述作者提供此方便的程式,範例可從網站中下載) 由於舊的win32應用程式和.NET FRAMEWORK 2.0有些無法在VISTA以後的作業系統順利執行。控制win7作業系統輸入法亦然,但利用上述參考網址的範例在Visual Studio 2012 Desktop中開啟並執行後,會發生程式直接關閉的情形。輸出訊息最後一行如下所示: '[2672] VistaIMEHelperNet.vshost.exe: Managed (v4.0.30319)' 程式以返回碼 0 (0x0) 結束。 造成此問題是TSFWrapper.cs程式在做記憶體釋放使用到的函式 Marshal.FreeCoTaskMem(ptr) 有問題,詳細原因等待日後深入研究。目前把方法改用Marshal.FreeBSTR(ptr)的方式,即可在Win7 中執行。(後來發現是範例程式雖然是寫FreeCoTaskMem,但網址中的程式碼是寫FreeBSTR) 點擊第一個按鈕"Fetch Input Profile List"後列出所有安裝的輸入法,但只限中文輸入法。若安裝多國不同語言的輸入法,在Form1.cs中 button1_Click函式裡TSFWrapper.GetInputMethodList(langIDs[0])的langIDs可用其他值帶入,langIDs = TSFWrapper.GetLangIDs()可取得所有語言的ID。 例如:langID中文 = 1028;英文 = 1033;日文 = 1041 點選按鈕一列出所有安裝的輸入法 點擊第二項與第三項按鈕分別可切換輸入法與設定回預設英文輸入法。 不過將此做法用於非GUI的方式,也就是非windows form的方式,而是純console介面來呼叫第二與第三個按鈕function會出現crash。以下為跳出錯誤訊息視窗的內容: 類型 'System.Runtime.InteropServices.COMException' 的未處理例外狀況