顯示具有 CxxlMan2 程式庫 標籤的文章。 顯示所有文章
顯示具有 CxxlMan2 程式庫 標籤的文章。 顯示所有文章

2020年9月4日 星期五

設計 Singleton 模式的插件

這裡的插件是指 CxxlMan2 程式庫的 cxxlObjectPlugin 插件,cxxlObjectPlugin 插件有一個特性,當某個 DLL 檔所提供的所有 cxxlObjectPlugin 物件已無使用者時,這個  DLL 檔就會被卸載。

但 DLL 檔提供的物件若是一般的 Singleton 模式物件,那麼永遠都會有一個不能放棄的持有記錄,即使已無持有者了,這個 DLL 檔也永遠卸不掉。這時可藉由 LifeCustody 這個工具的幫忙,就可以解決這問題。

因要設計成 DLL 和 使用端 兩部份,所以直接提供範例原始檔:
SingletonExample.zip

要編譯這範例須先如下的東東:

  1. CxxlMan2 程式庫 - 抓最版,順便說明檔也一起抓吧
  2. CMRegSelf 插件註冊輔助 - 內附說明
  3. LifeCustody 物件終結插件 - 內附說明

範例有提供 CMake 的支援,編譯不會很難

大致說一下這個範例,test.cpp 定義了兩個 class Input 及 class Output,建立後會各別由 DLL 插件取得 ISingleton 物件,因取得的 ISingleton 是同一個物件,所以 Input::PutStr() 輸入的文字可以由 Output::GetStr() 取出。當兩個 Input 及 Output 物件銷毀時也會通知 DLL 插件銷毀 ISingleton 物件。







2020年6月10日 星期三

Template cxxlObjectPlugin 插件

這是個範例,用來示範如何把 template class 做成 cxxlObjectPlugin 插件,下載點:
Template cxxlObjectPlugin.7z

因範例是用 Console 視窗顯示 utf-8 文字,所以先參考 修改 Win10 的 Console 視窗顯示 UTF-8

因 cxxlObjectPlugin  插件須在執行時期經由 CM 在 .cpp 程式中建立,而 template class 則是在編譯時期就須產生物件,解決的辦法是把產生 template class 物件的程式碼帶到 .cpp 中執行。見 Plugin.HPP 中 IPlugin1<T>::Create() 的做法,而在 Plugin.cpp 中 IPlugin1_New() 負責執行以產生 IPlugin1<T> 物件。

一般來說 cxxlObjectPlugin  插件會做成 介面類別 <-- 實作類別 的繼承架構,IPlugin2<T> 就試圖這樣搞,但實作類別會在 .cpp 中,編譯完後早就寫死了,如何去繼承 template 介面類別, IPlugin2<T>::Create() 就試圖這樣搞,但沒成功。


2019年5月18日 星期六

LifeCustody 物件終結插件

CxxlMan2 程式庫的核心主要建構在垃圾回收(Gabage Collector)機制,藉由 cxxlObject 和 Smart_Ptr 的相互搭配,達到 cxxlObject 物件無 Smart_Ptr 持有時就會自動銷毀,但若有某些原因,要讓物件不想被繼續使用了,如何通知各 Smart_Ptr 放棄持有呢?這個插件就為了達成這樣的目的。

下載點:
LifeCustody_Src_20200430.zip

2018年5月8日 星期二

猜數字 - ML 多國語言應用範例

這是一個實驗程式,有兩個實驗目標。

  1. 測試 ML 在 主程式 和 插件 是否能各別建立自己的多國語言能力,但兩者間又能互通,因插件可能和主程式在不同時期或不同人所開發,因此能否各別獨立建立自己的多國語言能力,勢必成為必須的目標。但還得讓插件可以隨主程式一起變動,這是可選擇性的,但卻是最常用的選項。這部份的實驗很成功,同時使用 "wxWidgets 的延伸控制件 for ML" 可以即時更動 GUI 的文字語言,結果很令人滿意。
  2. 測試 主程式 和 插件 間的非同步互動,這部份花了最多時間,也很雜亂,應該還有 bug 存在,因有時還是會出槌。因為是非同步處理所以抓 bug 又很麻煩,所以點到就好了,主要還是在 ML 的實驗。事後想想若一開始用圖靈機制規劃好應該會比較容易。
主程式所用的譯文檔置於 Lang 子目錄下,插件所用的譯文檔在 plugin\GuestCore_1_0\Lang,插件還提供機器人用的 密語,純好玩別當真,可用 MLedit 增修更多語言的譯文檔。

2018年5月7日 星期一

MLedit 多國語言編輯器

這是為 ML 插件製作譯文檔的輔助程式,本身所用的譯文檔置於 Lang 子目錄下,觀迎大家幫忙擴增更多語言的譯文。

下載點:

完整檔案包,可直接執行 MLedit.exe

MLedit_0.1.0_complete.7z


精簡檔案包,適用於已安裝 CxxlMan2 開發環境懶人包,執行 "MLedit.exe - 捷徑 "

MLedit_0.1.0_simplify.7z


原始檔案包,適用於已安裝 CxxlMan2 開發環境懶人包,解壓到 C:\MySrc,支援 CMake 建立編譯專案

MLedit_0.1.0_Src.7z


以下為新版:

CxxlMan2 開發環境懶人包

這是以 CodeBlocks 為開發環境架構出來的懶人包,包含 CxxlMan2 程式庫和插件、MinGw 5.1 以及  wxWidgets 3.1.1,內含設置說明

CxxlMan2 開發環境懶人包 20180606.7z


以下是 wxWidgets 教程簡體中文譯文:
https://wizardforcel.gitbooks.io/wxwidgets-book/index.html


2018年5月6日 星期日

wxWidgets 的延伸控制件 for ML(多國語言插件)

延伸 wxWidgets 的控制件,達成和 ML 互動
延伸出的控制件的命名為原控制件名稱後多加 Ext,如:wxMenuExt
配合 CodeBlocks 的 wxSmith 的用法以順利取代原控件

目前提供的控制件如以下所列,可依樣畫葫蘆自己增加

2018年1月2日 星期二

Sprintf 簡單風格字串格式化

用於處理字串格式化的小工具,可指定參數在字串中的插入位置。

範例:

stringstream ss;
Sprintf(ss, "我搭{1}去{0}。", "台北", "火車");

{0} = 第一個參數
{1} = 第二個參數
...

若有錯誤回傳 false,表示指定的參數超過提供的數量範圍

下載:
SPRINTF_1_1_4.zip

2018年1月1日 星期一

TlcMultiple 小工具程式原碼

用於處理 CxxlMan2 函數庫 TLC 文件的同名項目的小工具。
最好的處理方式是 匯入->排序->匯出,以人工方式處理標示同名的項目。
除非確定自動刪除同名項目不會有問題,否則請小心使用 MultipleClear() 功能

下載:
TlcMultiple_1_0_0.zip

使用範例:
先安裝好 CxxlMan2 函數庫,以下是使用範例

2017年12月9日 星期六

CMRegSelf 插件註冊輔助

這是一個輔助性的插件,幫忙減輕 cxxlObjectPlugin 插件註冊的繁雜規劃,也減輕應用程式註冊插件的負擔。為此,CxxlMan2 的標準插件 CxxlMan2Plugin 全部修改成全面支援 CMRegSelf。

CMRegSelf 的機制在於讓 CxxlMan2Plugin 插件檔(dll 檔)有自我註冊插件的能力,並提供主程式註冊這些插件檔的功能。同時也提供一個範例,以期能完全瞭解這些運作。

注意!由於不同系列編譯器編碼的差異(比如 vc 與 gcc),不要把它們放置在一起或同一個插件搜尋路徑中,否則註冊處理時會有當掉的危險。所以內定的 CxxlMan2Plugin 資料夾也要有分別,比如分成 C:\CxxlMan2Plugin_vc 和 C:\CxxlMan2Plugin_gcc

下載點:
CMRegSelf_Src_20181106.zip

2017年5月6日 星期六

碎形幾何測試程式




以上影片說的是碎形幾何,若覺得手癢也想試試,以下的程式可幫上一點忙。

程式使用到 CxxlMan2 程式庫,可到 http://blog.cxxl3d.tk/2015/10/cxxlman2-class-lib.html 下載,不過只用到 cxxlcommon\include 內的引入檔,所以不用編譯這個程式庫,只要把 THREADMGR.HPP 所在的完整路徑加到 include path 就可以了。

程式在 Win10 用 vs2015 和 MinGW 6.3 編譯跑過沒有問題,程式只是一個架構,把程式碼整個複製貼上就能用了。

2017年4月30日 星期日

替死鬼模式

cxxlObject 物件須所有持有者放棄才會結束,若有特殊的持有者不會主動放棄,而是要等其他所有持有者放棄之後才會跟者放棄。

這時就有難題了,要怎麼知道其他持有者都放棄了,這時替死鬼就派上用場了,特殊的持有者仍持有該物件,其他持有者則改持有替身,等所有持有者放棄替身後,再由替身去要求特殊的持有者放棄該物件。

2016年9月12日 星期一

選用 OneDrive

在 放棄 Dropbox 文中有提到自動同步會失去備份的意義,有一個解決的辦法,就是把 Dropbox 資料夾的內容再備份一份,但這樣在電腦中就會多了一份,且會面臨可能會不一致的問題

而微軟出品的 OneDrive 有一個方便的功能,可以選擇哪些資料要同步

因而確定中選,但不願意同步的資料夾,在本機上不會留存會自動刪掉,不過仍存放在 OneDrive 請放心

本站上和 CxxlMan2 程式庫相關的檔案已由 Dropbox 轉到 OneDrive,可以下載了

2016年9月11日 星期日

放棄 Dropbox

由於這網站許多檔案放在 Dropbox 免費空間作為分享,但最近不知為什麼檔案的連結功能被鎖了,點選檔案的連結會得到如下的回應畫面

Dropbox 的一個特點是可以自己電腦中的檔案和 Dropbox 儲存的檔案自動同步,看似很方便,但卻失去了備份意義。如果你誤刪了自己電腦中的檔案,Dropbox 儲存的那份也會被刪掉,反過來看誤刪了Dropbox 儲存的檔案也會刪掉自己電腦中的那一份,不管哪一邊被入侵都等於全完了

以上兩點原因決定放棄 Dropbox,不過須要一點時間尋找存放空間,以及修改連結


2016年9月6日 星期二

CMReg 註冊輔助插件

【已放棄此用法,會再上傳新版本,新做法,舊有插件也會更動,敬請期待...】
這是一個輔助性的插件,幫忙減輕 cxxlObjectPlugin 插件註冊的繁雜規劃,也減輕應用程式註冊插件的負擔。

下載點:
CMReg_Src_20160906.zip

2016年8月29日 星期一

網路通訊插件

適用於 CxxlMan2 程式庫的插件,讓程式設計比較容易上手,目前只提供 TCP/IP 協定機制,可跨平台。
內含使用說明及範例,下載點:

CxxlSocket_Src_20160906.zip




2016年8月20日 星期六

cxxlObject 結束時要小心

CxxlMan2 程式庫的核心 cxxlObject 和 Smart_Ptr 保證了兩件事:
  1. cxxlObject 已沒有在被使用時,垃圾處理核心會自動銷毀。
  2. cxxlObject 若還在被使用就不會被銷毀,所以持有者可以放心使用,因至少還有一個持有者還在使用。

2015年10月28日 星期三

Smart_Ptr 的注意事項

Smart_Ptr 對包裹的對象採取隱性轉型的方式,使用有它的方便性,但也有它的危險性,用一個例子來說:

class A:public cxxlObject;
void f(const Smart_Ptr<A> &A_Arg);

A *pA = new A;
f(pA);

Smart_Ptr<A> 的建構子會隱性的接收 pA,而自動產生 Smart_Ptr<A> 實例傳給 f(),若 f() 的實作並未使用 Smart_Ptr<A> 保存,由 f() 返回時就會把 pA 刪掉。解決的辦法就是儘早先將 pA 先放入 Smart_Ptr:

多國語言插件

適用於 CxxlMan2 程式庫的插件,可輕鬆為你開發的程式擁有多國語言的能力。
內含使用說明及範例,下載點:

cxxlMutiLang_Src_20191205.zip (支援 CMRegSelf)