[Boost] ASIO學習筆記:thread
在前面的例子中,我們都是以single thread來執行,但在同步/非同步操作中,其實很多問題都需要multi-thread來解決,例如,多人的連線遊戲,就需要多條thread來配給每一個不同的連線。 在進行之前,我們必須要知道的是process跟thread的分別: 當我們在執行一個程式之後,就會產生一個process,這個process擁有以下二種東西: 1.自己的Memory space 2.一個以上的thread 而每一個thread又擁有以下二個東西: 1.Stack:紀錄函數呼叫路徑,以及這些函數所用到的區域變數(local variable) 2.目前CPU的狀態 由於thread有自己的stack,因此每個thread雖然共享同一個Memory space可以存取到彼此之間的物件,但卻無法存取到對方的local variable 由於thread只是多工而不是平行運算,因此OS會依照thread所設定的優先權,分配相應的時間讓其使用CPU。例如:當我們在玩遊戲的時候,遊戲程式執行後會產生一個process,而這個process中會有如播放音樂、更新畫面…等許多的任務,這時候我們可以分配不同的thread去執行並分配其優先順序 創建、分配thread及其優先順序通常是程式設計師自己要寫,當我們使用遊戲引擎如OGRE、hge等來寫遊戲的話,如果沒特別導入如boost::thread這類的函式庫的話,其實都會是single thread的程式,也就是說,我們必須讀完所有的resource才能進行遊戲,不能夠一邊讀resource一邊顯示讀檔的進度。 基本上,當一個程式開始執行的時候,他只會存在一個執行main() function的thread,使用multi-thread的重要性在於,除了他能夠做到以上的事情之外,更重要的是,由於現在的電腦都擁有1顆以上的CPU,因此我們可以更進一步的分配這些thread給不同的CPU來運算 以下展示了一個簡單的boost::thread程式: void thread(const char* name) { for (int i = 0; i < 5; ++i) { std::cout << name << std::endl; … Continued
[Boost] ASIO學習筆記:初探io_service
ASIO的實現,其實就是基於Proactor pattern,在這裡我們先不對這個pattern做探討,等以後有機會再來談 想像io_service即是os跟我們程式之間的橋梁,當執行io_service.run()的時候,便是將系統轉移到os上,並block住原本的程式,直至所有的工作佇列完成,其是一種synchronous 模式。 只是,有時候我們並不希望程式在完成工作之後就結束,而是繼續等待是否有其他工作傳入,這時候我們就可以加入boost::asio::io_service::work work( io_service );,以便讓系統能夠持續的運行。 完整程式碼如下: #include <boost/asio.hpp> #include <iostream> int main( int argc, char * argv[] ){ boost::asio::io_service io_service; boost::asio::io_service::work work( io_service ); io_service.run(); std::cout < < “這行永遠到不了” << std::endl; return 0; } 為什麼會這樣呢?那是因為work object 提供一個work給 … Continued
[Boost] ASIO學習筆記:hello_world
ASIO為Boost中的一套網路函式庫,全名為asynchronous input/output,如同他的名稱,這個函式庫的核心是在處理各種同步或非同步的問題。 要學習這套函式庫,其實最好是先從其官方的教學開始:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio.html 其實寫的還蠻不錯的,再來就是可以搭配以下幾個教學:http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=2http://en.highscore.de/cpp/boost/index.html 以下為一個最簡單的asio程序: #include <boost/asio.hpp> #include <iostream> int main( int argc, char * argv[] ){ boost::asio::io_service io_service; io_service.run(); std::cout < < “Hello world!” << std::endl; return 0; } 以上程序還沒有關係到網路,主要就只是在展示我們的程式跟OS系統操作權之間的轉移而已 其中io_service為我們的程式跟operating system’s I/O services的接口而io_service.run()會將系統操作權交給OS,而我們的程式會一直block在這一行,直至所有非同步的工作已經完成 關於非同步,讓我們來看加入非同步操作情形來解釋: #include <boost/asio.hpp> #include <iostream> … Continued
[python]python學習筆記part4
>>> r’\t’ =>字串前面加r代表是以原始字串來表示 \\t 使用三重引號來表示跨越數行的字串,如: ”’ xxxxxxxxxxxxxx xxxxxxxxxxxxxxx”’ 裡面內容不管輸入什麼就是什麼(就算是換行或縮排),如上面的例子就是多了一個\n >>> ‘apple’ in ‘my_apple’ ==>測試字串內容是否存在 True >>> text1 = ‘Just’ >>> text1 * 10 ‘JustJustJustJustJustJustJustJustJustJust’ >>> >>> ord(‘A’) =>查Ascii碼 65 >>> chr(65) =>由Ascii碼轉文字 ‘A’ >>> >>> name = ‘Justin’ >>> name[0] … Continued
[python]python學習筆記part3
input: name = input(“請輸入你的名稱:”) print: =>print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout) print(1, 2, 3, sep=”,”, end=”\n\n”) #以,作為分隔,結束時多空2行 print(1, 2, 3, file = open(“data.txt”, “w”)) #將資料寫入data.txt open回傳_io.TextIOWrapper物件 格式化字串: text = “%d %.2f %s” % (10, 0.3, “test”) int(“1″) =>形態轉換 open: open(file,mode=”r”,buffering=None,encoding=None, … Continued
[Python]Python學習筆記part2
何謂模組?指的就是python中一個一個的.py檔 若hello.py的內容如下 import sys fileName = sys.argv[0] arr = sys.argv[1:] print(fileName) print(arr) 則執行 python python.py 111 222 可印出python.py及包含111及222的陣列 當我們執行import時,會先執行該模組中的每一行 若要只import模組中的某個變數,則可如此下指令: frome hello import arr print(arr) 當然會是空陣列,因為沒有傳入任何的參數 另外,在import之後,你會在.\__pycache__下發現 .pvc檔案 (若程式在該目錄有檔案獨寫權限的話) 這個檔案等同於C++中的.o檔,為binary code,目的是用來減少直譯的時間,增加執行的速度 (若原始碼有更改的話就再重新產生) from import指令的功用是”複制”模組中的參數 並不會影響原本參數的數值 使用dir(hello)可以得到hello模組中所有的參數名稱陣列 from hello import sys, … Continued
[Python]Python學習筆記 part1
首先至官網下載python安裝檔後安裝後(這裡使用3.2版本),找到安裝目錄(如:C:\Python32),並將其加入環境變數的路徑下(我的電腦->內容->進階->環境變數->系統變數->Path) =>用意在於讓dos能夠找到python的執行路徑 之後打開dos=>鍵入python後進入編譯模式 >>>print(“hello!world!); hello!world >>>print(“he\”llo!worl\’d!”); he”llo!worl’d \符號為脫逸字元 _為上次運算儲存的結果 執行: >>>for i in range(1, 4): …print(i) 如出現: indentationerror expected an indented block時,是因為Python強制程式碼縮排以維護可讀性,而上面的print(i)因為沒有縮排,所以才會造成錯誤。多空幾個空白改成以下方法即可: >>>for i in range(1, 4): … print(i) … 1 2 3 要注意的是,在打完程式之後,要連續按二個enter程式才會執行 定義function的方法: def function: print(“do something”) #do … Continued
[C/C++]DLL相關知識
請參考以下連結: http://tw.myblog.yahoo.com/blue-comic/article?mid=-2&prev=556&l=a&fid=17 http://www.wretch.cc/blog/fredxxx123/9249665 http://home.educities.edu.tw/wanker742126/win32asm/w32asm_ch20.html
[Server]Apache+PHP+MySQL架設過程記錄
記錄一下比較關鍵的問題 這樣以後裝的時候才不用一直去google~ apache: 在安裝過後如果一直無法成功將啟動的話, 到console模式apache安裝資料夾的bin底下,執行: httpd.exe -w -n “Apache2.2” -k start 這樣就會詳細列出錯誤,會比較好debug 當然,”Apache2.2″要看你安裝的版本而改變 這個階段會打不開的原因,大致上都是因為port衝到, 例如skype預設是用80 port,所以要先將他關掉 在正式測試之前,記得到防火牆把80port打開 PHP: 比較大的問題是在安裝之後,在重啟apache的時候會無法打開,用上面的方法來找原因則會出現apache2_2.dll無法載入的訊息。這時候請開啟apache的httpd.conf,找出php相關設定將其改成以下內容: #BEGIN PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL PHPIniDir “C:\workspace\PHP” LoadModule php5_module “C:\workspace\PHP\php5apache2_2.dll” #END PHP INSTALLER EDITS – REMOVE ONLY … Continued
[C/C++]MySQL中語句擁有 ‘ 符號時該如何insert
我們知道SQL在字串insert的時候需要 ‘ ‘ 在指定在其中是字串型態 可是如果在要insert的字串之中出現該字元,將會導致原本的insert失敗 此時我們可以用以下的function去將該字串脫逸掉 std::string escapeString(const char *pStr) { char *tStr = new char[strlen(pStr)*2+1]; mysql_real_escape_string(conn, tStr, pStr, strlen(pStr)); string retStr(tStr); delete [] tStr; return retStr; } 呼叫時: string es = escapeString(“It’s a te’st~’測’試”); string SQL = “insert into … Continued