2010年6月16日 星期三

First Qt program - Hello

0 意見
程式碼如下:(參考良葛格Qt4範例)


qmake -project: 產生 .pro 專案檔
qmake: 產生 Makefile
make

然後切換至 debug 目錄
執行 hello

執行結果:


Learning Materials:
Tutorials
http://doc.qt.nokia.com/4.6/tutorials.html

How to Learn Qt
http://doc.trolltech.com/4.6/how-to-learn-qt.html

All Overviews and HOWTOs
http://doc.trolltech.com/4.6/overviews.html

API References
http://doc.trolltech.com/4.6/index.html

Qt 環境配置 [Windows]

0 意見
1. 下載 MinGW - Minimalist GNU for Windows
網址:http://sourceforge.net/projects/mingw/files/

安裝下列三者:
a. MinGW base tools
b. g++ compiler
c. MinGW Make

設定環境變數:
C:\MinGW\bin

MinGW base tools 包含下列項目:


2. 下載 QT Framework
網址:http://qt.nokia.com/downloads/


設定環境變數:
C:\Qt\4.6.3\bin

執行開始功能表中 Qt 資料夾
(預設名稱為 "Qt by Nokia v4.6.3 (OpenSource)")裡的
"Qt 4.6.3 (Build Debug Libraries)",
以建立 Debug Library。
(這個過程可能需要2個小時以上)


build成功後,如下圖:



相關連結:
http://program-lover.blogspot.com/2008/09/installing-qt-on-windows.html

2010年6月8日 星期二

message queue

0 意見
1. msgQ很像fifo, 但是更有效率。
2. 讓兩個不相關的程序可以傳送資料。
3. 可免除同步化和擱置的問題。

sys/msg.h
sys/types.h
sys/ipc.h

int msgctl(int id, int command, struct msgid_ds *buf):
控制函數 (IPC_STAT, IPC_SET, IPC_RMID)

int msgget(key_t, int msgflg):
產生和存取 msgQ (IPC_CREAT)

int msgrcv(int id, void *msg_ptr, size_t sz, long int msgtype, int msgflg):
從 msgQ 取出訊息

int msgsnd(int id, const void*msg_ptr, size_t sz, int msgflg):
增加一個 msg 至 queue
struct msg {
long int type;
/*the data you wish to transfer*/
char data[MAX_SIZE];
}
第三個參數 sz, 是 msg_ptr 的大小, 但是不包含第一個 long int
第四個參數 msgflg 如果含 IPC_NOWAIT, 則會立即回覆

舉例來說,
如果伺服器與客戶端要溝通,雙方可以各有一個 msgQ,
而如果有很多客戶端,如果使用大量的 msgQ,可能會較浪費;
此時可以試著將第一個 type 欄位拿來記錄客戶端的 ID,
用來區別要送到哪個客戶端;
而每個客戶端也可以抓取屬於他們自己的訊息,
而不會動到其它客戶端的訊息。

socket programming - select

0 意見
socket介面其實很像pipe,使用方式很雷同,但是還可以跨越網路通訊。

平常在實作中,常使用無窮迴圈做 busy wait,然後掃描是否有需要處理的事件;
但是這樣的方式較耗費CPU時間。

sys/types.h
sys/time.h
現在,可以試著使用 select() 系統呼叫,
可以同時處理很多檔案描述子(就像是很多客戶端),
但是沒有任何輸入/輸出時,
是處於擱置狀態。

select() 在 fd_set 的結構上運作,
我使用過的例子是設定 socket 為 Non-Block 模式,
然後 select 設定 Timeout 時間,
如果 time out 時間過了仍然沒有任何事件發生需要處理,
select() 也會回覆。

select() 回傳 -1 代表失敗,並會設定errno說明錯誤。
藉由 timeout 的管理,如果發生 time out,select() 會回傳0。

不多說,來看個例子吧!