December 30,2005
透過另一個 Thread 來操作 UI
在.Net Framework 下,Windows UI 是由單一的 Thread 來負責的,如果當有一個非 UI Thread 要改變 UI 的一些相關資料以及狀態時,.Net framework 會產生一個 System Exception 來攔截這個動作,也因此,我們必需要做一些特殊處理來繞過這個機制。
而主要的方法就在於,使用BeginInvoke() 以及 EndInvoke() 來觸發一個事件(Event),再讓 UI 本身認為接收到這個事件產生對應的處理。例如,我有一個用來在 ListView 上加入一行記錄的副程式,原始的寫法如下:
這個在單一執行緒的程式裡並沒有問題,但是如果要讓多執行緒的程式也可以使用時,必需修改成如下的形式:
而主要的方法就在於,使用BeginInvoke() 以及 EndInvoke() 來觸發一個事件(Event),再讓 UI 本身認為接收到這個事件產生對應的處理。例如,我有一個用來在 ListView 上加入一行記錄的副程式,原始的寫法如下:
void MSG(String ^s)
{
ListViewItem ^tmp = ListView->Items->Add(L"MSG");
tmp->SubItems->Add(String::Contact(DateTime::Now);
tmp->SubItems->Add(s);
}
這個在單一執行緒的程式裡並沒有問題,但是如果要讓多執行緒的程式也可以使用時,必需修改成如下的形式:
delegate MSGDelegate(String ^s);
void MSG(String ^s)
{
// 檢查是否不是由 UI Thread 來的呼叫
if (this->InvokeRequired)
{
// 產生一個臨時的 delegate
MSGDelegate del = gcnew MSGDelegate(MSG);
// 讓系統去觸發這個 delegate
IAsyncResult ^r =this->BeginInvoke(MSG, s);
// 結束這個 delegate
this->EndInvoke(r);
return;
}
// 真正執行的內容
ListViewItem ^tmp = ListView->Items->Add(L"MSG");
tmp->SubItems->Add(String::Contact(DateTime::Now);
tmp->SubItems->Add(s);
}
December 29,2005
.Net Framework delegate in C++
.Net Framework 裡頭有一個新的 keyword 叫做 delegate (這個基本上我懷疑是從 Cocoa Framework抄來的:P),主要是可以讓程式設計師方便地動態指定當一些事件發生時,該執行什麼函式來處理。下面是一個簡單的範例:
//宣告一個 delegate 的樣板
delegate void OnTestCallBack(String ^s);
//當 OnTest 發生時呼叫的 function
void OnTest Func(String ^s)
{
Console::WriteLine(s);
}
int main()
{
//用模板建一個 delegate 物件
OnTestCallBack ^OnTest;
//把 OnTestFunc 指定給這個物件,如果物件已建立,可以用 += 將複數個 Func 指定上去
OnTest = gcnew OnTestCallBack(OnTestFunc);
// OnTest 事件發生了!
OnTest("TEST!!!!!");
}
//宣告一個 delegate 的樣板
delegate void OnTestCallBack(String ^s);
//當 OnTest 發生時呼叫的 function
void OnTest Func(String ^s)
{
Console::WriteLine(s);
}
int main()
{
//用模板建一個 delegate 物件
OnTestCallBack ^OnTest;
//把 OnTestFunc 指定給這個物件,如果物件已建立,可以用 += 將複數個 Func 指定上去
OnTest = gcnew OnTestCallBack(OnTestFunc);
// OnTest 事件發生了!
OnTest("TEST!!!!!");
}
December 26,2005
.Net 下的 TCP/IP Server 開發
.Net Framework 下寫 TCP/IP Server 應該還算方便(不過我不禁還是要說,Delphi更讚)
由於有包裝好現成的 TCPListener Class,建立元件後,該填的資料填一填,
一個會動的 Server 就出來了,以下是摸出來的範例:
由於有包裝好現成的 TCPListener Class,建立元件後,該填的資料填一填,
一個會動的 Server 就出來了,以下是摸出來的範例:
|
果然微軟的東西還是Express版好用
就個人使用微軟產品的經驗來說,微軟的 Express 版本一向比全功能版本好用
(Ex: Outlook vs Outlook Express)
前一陣子微軟正在免費大放送 Visual Studio 2005 Express 版本
由於剛好自己手邊有一台開發機還沒有裝 .Net 2003,想說是免費的,不如抓來試試
一用之下,棍! 果然微軟的東西只能用 Express 版啊 :P
不管是啟動、編譯、執行的速度上來說,比上 .Net 2003都好上許多
不知道是因為版本較新用了一些新的技術,或是 Express沒有外掛一些阿哩不達的奇怪功能的關係
另一方面,.Net Framework 蠻讓人覺得高興的,該包的東西都包進來了
GUI方面現在也有Windows Form Application 這種 RAD Design 的方式可用了
總覺得比起以前的版本,這版的親和力高上許多,甚至有些 Delphi 的味道
不知道是不是因為 Microsoft 之前挖角了一些 Borland 的 Delphi 開發人員有關係
不過個人更想使用的是傳聞中的 Cocoa Framework for Win32
不知道到底會不會出啊,如果出了就太美好了
(Ex: Outlook vs Outlook Express)
前一陣子微軟正在免費大放送 Visual Studio 2005 Express 版本
由於剛好自己手邊有一台開發機還沒有裝 .Net 2003,想說是免費的,不如抓來試試
一用之下,棍! 果然微軟的東西只能用 Express 版啊 :P
不管是啟動、編譯、執行的速度上來說,比上 .Net 2003都好上許多
不知道是因為版本較新用了一些新的技術,或是 Express沒有外掛一些阿哩不達的奇怪功能的關係
另一方面,.Net Framework 蠻讓人覺得高興的,該包的東西都包進來了
GUI方面現在也有Windows Form Application 這種 RAD Design 的方式可用了
總覺得比起以前的版本,這版的親和力高上許多,甚至有些 Delphi 的味道
不知道是不是因為 Microsoft 之前挖角了一些 Borland 的 Delphi 開發人員有關係
不過個人更想使用的是傳聞中的 Cocoa Framework for Win32
不知道到底會不會出啊,如果出了就太美好了