• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            cocos2d-x-2.2.2 android開(kāi)發(fā)環(huán)境

            一、準(zhǔn)備
            1. adt-bundle(包括了eclipse+sdk)
            2. ndk: r9版本以上, 無(wú)需安裝cygwin,新版本ndk不再依賴該編譯環(huán)境
            3. cocos2d-x-2.2.2
            4. jdk

            二  安裝
            1 安裝jdk,配置java環(huán)境
            JAVA_HOME:D:\Andorid\Java\jdk1.7.0_25(安裝路徑)
            CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
            Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
            運(yùn)行 java -version
                 javac
            檢測(cè)是否安裝成功

            2 解壓cocos2dx, 安裝cocos2dx, cmd到cocos2dx目錄下,運(yùn)行build-win32.bat

            3 配置 eclipse
              打開(kāi)eclipse,點(diǎn)擊window->perfernces->Android,
              在SDK Location中填上剛剛下的adt-bundle解壓后的D:\Andorid\adt\sdk
              window->perfernces->Android->NDK中填ndk路徑 D:\Andorid\android-ndk-r9(自己的解壓路徑)
             
            導(dǎo)入android項(xiàng)目
             項(xiàng)目屬性->c/c++ build->Builder Settings->Bild command:填寫(xiě)ndk路徑\ndk-build.cmd
             項(xiàng)目屬性->c/c++ build->Environment 添加變量 NDK_MODULE_PATH    cocos2dx目錄;cocos2dx目錄\cocos2dx\platform\third_party\android\prebuilt

            posted @ 2014-07-24 17:55 多彩人生 閱讀(309) | 評(píng)論 (0)編輯 收藏

            jdk與jre的區(qū)別

            http://www.cnblogs.com/myitm/archive/2011/05/03/2035942.html

            很多程序員已經(jīng)干了一段時(shí)間java了依然不明白jdk與jre的區(qū)別。
            JDK就是Java Development Kit.簡(jiǎn)單的說(shuō)JDK是面向開(kāi)發(fā)人員使用的SDK,它提供了Java的開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境。SDK是Software Development Kit 一般指軟件開(kāi)發(fā)包,可以包括函數(shù)庫(kù)、編譯程序等。
            JRE是Java Runtime Enviroment是指Java的運(yùn)行環(huán)境,是面向Java程序的使用者,而不是開(kāi)發(fā)者。
            如 果安裝了JDK,會(huì)發(fā)同你的電腦有兩套JRE,一套位于 \jre 另外一套位于 C:\Program Files\Java\jre1.5.0_15 目錄下,后面這套比前面那套少了Server端的Java虛擬機(jī),不過(guò)直接將前面那套的Server端Java虛擬機(jī)復(fù)制過(guò)來(lái)就行了。而且在安裝JDK可 以選擇是否安裝這個(gè)位于 C:\Program Files\Java 目錄下的JRE。如果你只安裝JRE,而不是JDK,那么只會(huì)在 C:\Program Files\Java 目錄下安裝唯一的一套JRE。
            JRE的地位就象一臺(tái)PC機(jī)一樣,我們寫(xiě)好的Win32應(yīng)用程序需要 操作系統(tǒng)幫我們運(yùn)行,同樣的,我們編寫(xiě)的Java程序也必須要JRE才能運(yùn)行。所以當(dāng)你裝完JDK后,如果分別在硬盤(pán)上的兩個(gè)不同地方安裝了兩套JRE, 那么你可以想象你的電腦有兩臺(tái)虛擬的Java PC機(jī),都具有運(yùn)行Java程序的功能。所以我們可以說(shuō),只要你的電腦安裝了JRE,就可以正確運(yùn)行Java應(yīng)用程序。
            1、為什么Sun要讓JDK安裝兩套相同的JRE?
            這 是因?yàn)镴DK里面有很多用Java所編寫(xiě)的開(kāi)發(fā)工具(如javac.exe、jar.exe等),而且都放置在 \lib\tools.jar 里。從下面例子可以看出,先將tools.jar改名為tools1.jar,然后運(yùn)行javac.exe,顯示如下結(jié)果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 這個(gè)意思是說(shuō),你輸入javac.exe與輸入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main 是一樣的,會(huì)得到相同的結(jié)果。從這里我們可以證明javac.exe只是一個(gè)包裝器(Wrapper),而制作的目的是為了讓開(kāi)發(fā)者免于輸入太長(zhǎng)的指命。 而且可以發(fā)現(xiàn)\lib目錄下的程序都很小,不大于2 9K,從這里我們可以得出一個(gè)結(jié)論。就是JDK里的工具幾乎是用Java所編寫(xiě),所以也是Java應(yīng)用程序,因此要使用JDK所附的工具來(lái)開(kāi)發(fā)Java程 序,也必須要自行附一套JRE才行,所以位于C:\Program Files\Java目錄下的那套JRE就是用來(lái)運(yùn)行一般Java程序用的。
            2、如果一臺(tái)電腦安裝兩套以上的JRE,誰(shuí)來(lái)決定呢?
            這 個(gè)重大任務(wù)就落在java.exe身上。Java.exe的工作就是找到合適的JRE來(lái)運(yùn)行Java程序。 Java.exe依照底下的順序來(lái)查找JRE:自己的目錄下有沒(méi)有JRE;父目錄有沒(méi)有JRE;查詢注冊(cè)表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的運(yùn)行結(jié)果與你的電腦里面哪個(gè)JRE被執(zhí)行有很大的關(guān)系。

            ADD:(小小結(jié))
            1.JVM -- java virtual machineJVM就是我們常說(shuō)的java虛擬機(jī),它是整個(gè)java實(shí)現(xiàn)跨平臺(tái)的最核心的部分,所有的java程序會(huì)首先被編譯為.class的類(lèi)文 件,這種類(lèi)文件可以在虛擬機(jī)上執(zhí)行,也就是說(shuō)class并不直接與機(jī)器的操作系統(tǒng)相對(duì)應(yīng),而是經(jīng)過(guò)虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將程序解釋給本地系 統(tǒng)執(zhí)行。2.JRE -- java runtime environmentJRE是指java運(yùn)行環(huán)境。光有JVM還不能成class的執(zhí)行,因?yàn)樵诮忉宑lass的時(shí)候JVM需要調(diào)用解釋所需要的類(lèi)庫(kù) lib。在JDK的安裝目錄里你可以找到j(luò)re目錄,里面有兩個(gè)文件夾bin和lib,在這里可以認(rèn)為bin里的就是jvm,lib中則是jvm工作所需 要的類(lèi)庫(kù),而jvm和 lib和起來(lái)就稱為jre。所以,在你寫(xiě)完java程序編譯成.class之后,你可以把這個(gè).class文件和jre一起打包發(fā)給朋友,這樣你的朋友就 可以運(yùn)行你寫(xiě)程序了。(jre里有運(yùn)行.class的java.exe)3.JDK -- java development kitJDK是java開(kāi)發(fā)工具包,基本上每個(gè)學(xué)java的人都會(huì)先在機(jī)器上裝一個(gè)JDK,那他都包含哪幾部分呢?讓我們看一下JDK的安裝目錄。在目錄 下面有六個(gè)文件夾、一個(gè)src類(lèi)庫(kù)源碼壓縮包、和其他幾個(gè)聲明文件。其中,真正在運(yùn)行java時(shí)起作用的是以下四個(gè)文件夾:bin、include、 lib、 jre?,F(xiàn)在我們可以看出這樣一個(gè)關(guān)系,JDK包含JRE,而JRE包含JVM。bin:最主要的是編譯器 (javac.exe)include:java和JVM交互用的頭文件lib:類(lèi)庫(kù)jre:java運(yùn)行環(huán)境(注意:這里的bin、lib文件夾和 jre里的bin、lib是不同的)總的來(lái)說(shuō)JDK是用于java程序的開(kāi)發(fā),而jre則是只能運(yùn)行class而沒(méi)有編譯的功能。
            eclipse、idea等其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時(shí)你會(huì)發(fā)現(xiàn)他們只要求你選中jre路徑就ok了。

            posted @ 2014-07-24 17:53 多彩人生 閱讀(230) | 評(píng)論 (0)編輯 收藏

            無(wú)名

            一直在看校友群,卻不知道該說(shuō)什么.
            長(zhǎng)大了一點(diǎn)也不好,不能像小時(shí)候那樣說(shuō)話了

            posted @ 2014-06-30 14:17 多彩人生 閱讀(290) | 評(píng)論 (1)編輯 收藏

            適者生存

            有一個(gè)好成績(jī)不難,因?yàn)橛欣蠋熃o你指路,因?yàn)閱?wèn)題有標(biāo)準(zhǔn)答案. 而當(dāng)你走上了社會(huì),你會(huì)發(fā)現(xiàn),沒(méi)有人再給你指路,也沒(méi)有人能給你指路,很多很多都是自己一次次嘗試,一次次失敗摸出來(lái)的. 這個(gè)社會(huì)更沒(méi)有標(biāo)準(zhǔn)答案, 大自然的生存法則就是適者生存,也就是強(qiáng)者生, 有說(shuō)對(duì)錯(cuò)嗎? 你適了,你強(qiáng)了,你就對(duì)了

            posted @ 2014-06-14 15:02 多彩人生 閱讀(138) | 評(píng)論 (0)編輯 收藏

            自定義路徑創(chuàng)建Cocos2d-x項(xiàng)目

            http://www.cnblogs.com/skynet/archive/2013/11/17/3428369.html


            --------------------------------------------------

            自定義路徑創(chuàng)建Cocos2d-x項(xiàng)目

            本文介紹windows下面如何優(yōu)雅的創(chuàng)建Cocos2d-x項(xiàng)目。為何稱之為優(yōu)雅,是因?yàn)楝F(xiàn)在網(wǎng)上流傳的一些創(chuàng)建方法有一些問(wèn)題。大致內(nèi)容如下:

            使用VS向?qū)?chuàng)建Cocos2d-x項(xiàng)目(廢棄,不建議使用)

            使用create_project.py

            問(wèn)題1:工程名等替換不完全

            問(wèn)題2:創(chuàng)建項(xiàng)目不能指定路徑

            使用VS向?qū)?chuàng)建Cocos2d-x項(xiàng)目(廢棄,不建議使用)

            Cocos2d-x 2.1.3及之前,官方使用“install-template-msvc.bat”文件,安裝VS創(chuàng)建Cocos2d-x項(xiàng)目向?qū)?,然后可以按照向?qū)?chuàng)建Cocos2d-x項(xiàng)目。注意默認(rèn)情況下,新建項(xiàng)目的存放的位置應(yīng)該設(shè)置在Cocos2d-x引擎的安裝目錄下面,否則可能因?yàn)檎也坏綆?kù)文件而不能通過(guò)編譯。不過(guò)可以在設(shè)置項(xiàng)目屬性,頭文件和庫(kù)文件的搜索路徑來(lái)解決??梢詤⒖嘉抑暗囊黄┪摹?/span>C++靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)》,里面介紹如何設(shè)置vs項(xiàng)目屬性使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。

            Cocos2d-x 2.1.4,官方建議使用“create_project.py”來(lái)創(chuàng)建Cocos2d-x項(xiàng)目,并將在版本廢棄了“install-template-msvc.bat”

            We recommend you use multi-platform creating tools named create_project.py, which lies in tools/project-creator, to create a new project. This tool can create a project has the same folder structure as HelloCpp. Other tools such as create-android-project.sh will be removed in future.

            Note: VS template was deprecated in this release, please use 'tools/project-creator' instead.

            ——來(lái)自官網(wǎng):http://goo.gl/yVAjMr

            我入手Cocos2d-x的時(shí)候,剛發(fā)布Cocos2d-x 2.1.4,就被這個(gè)坑了。Cocos2d-x 2.1.4廢棄了“install-template-msvc.bat”,但是下載壓縮包里面又有,可惡的是不能用的,各種報(bào)錯(cuò)。同時(shí)網(wǎng)上流傳的就是使用這種方法,讓我繞了不少路。

            使用create_project.py

            create_project.pycocos2d-x/tools/project-creator/目錄下)使用方法比較簡(jiǎn)單:

            Usage: create_project.py -project PROJECT_NAME -package PACKAGE_NAME -language PROGRAMING_LANGUAGE

            Options:

             -project   PROJECT_NAMEProject name, for example: MyGame

             -package   PACKAGE_NAMEPackage name, for example: com.MyCompany.MyAwesomeGame

             -language PROGRAMING_LANGUAGEMajor programing lanauge you want to used, should be [cpp | lua | javascript]

            Sample 1: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame

            Sample 2: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame –language javascript

            注意:

            官方建議python使用2.7.3

            安裝python之后需要設(shè)置環(huán)境變量,或者使用該腳本時(shí)指定python路徑,如C:\python27\python.exe create_project.py …

            使用該方法創(chuàng)建項(xiàng)目之后,項(xiàng)目位于cocos2d-x/projects目錄下面。windows平臺(tái)進(jìn)入proj.win32,打開(kāi)工程文件即可。

            使用create_project.py創(chuàng)建項(xiàng)目的原理,即簡(jiǎn)單地將cocos2d-x\template目錄下的三種語(yǔ)言模板multi-platform-cppmulti-platform-luamulti-platform-js復(fù)制到對(duì)應(yīng)的新建工程目錄下,然后用PROJECT_NAMEPACKAGE_NAME替換模板中的HelloCpp/ HelloLua/ HelloJavascript

            問(wèn)題1:工程名等替換不完全

            下面是我用towergame做為工程名創(chuàng)建的lua項(xiàng)目,目錄如下:

            clip_image001[4]

            雖然可以正常編譯,但發(fā)現(xiàn)工程名未替換為towergame,這比較坑爹。一位日本開(kāi)發(fā)者lettas已經(jīng)有人提交了修復(fù)請(qǐng)求https://github.com/cocos2d/cocos2d-x/pull/3943,不過(guò)正式發(fā)布的版本中還沒(méi)有修改。急著用可以去github checkout下來(lái)用。

            問(wèn)題2:創(chuàng)建項(xiàng)目不能指定路徑

            使用create_project.py不能自定義路徑,必須放在cocos2d-x/projects目錄下面,這個(gè)設(shè)定我認(rèn)為非常不合理!這樣將自己的項(xiàng)目放到cocos2d-x引擎目錄中,不方便管理,即庫(kù)與項(xiàng)目耦合到一起了,如果cocos2d-x升級(jí)也不方便。

            比較合理的方案是:

            cocos2d-x獨(dú)立安裝,這樣對(duì)cocos2d-x升級(jí)也相對(duì)簡(jiǎn)單。

            新建cocos2d-x項(xiàng)目獨(dú)立于cocos2d-x安裝路徑。通過(guò)設(shè)置搜索或引用路徑,讓項(xiàng)目能夠找到cocos2d-x安裝路徑。

            幸運(yùn)的是,完全可以做到這樣。熟悉VS的同學(xué)應(yīng)該知道,VS工程設(shè)置是支持環(huán)境變量的。通過(guò)下面的一些改造,可以讓新建的cocos2d-x項(xiàng)目獨(dú)立于cocos2d-x引擎目錄:

            1)     將通過(guò)create_project.py創(chuàng)建的項(xiàng)目剪切到你希望放置的目錄;

            2)     創(chuàng)建環(huán)境變量COCOS2DX_HOME,指向cocos2d-x安裝目錄;

            3)     *.sln文件使用文本方式打開(kāi),將里面的所有相對(duì)路徑“..\..\..”都替換為環(huán)境變量%COCOS2DX_HOME%,如“..\..\..\cocos2dx\proj.win32\cocos2d.vcxproj”替換為“%COCOS2DX_HOME%\cocos2dx\proj.win32\cocos2d.vcxproj”;

            4)     *.vcxproj文件使用文本方式打開(kāi),將里面debug、release 2種模式下<AdditionalIncludeDirectories>節(jié)點(diǎn)定義的引用路徑中包含”$(ProjectDir)..\..\..\”都替換為環(huán)境變量“$(COCOS2DX_HOME)\”;注意這里使用環(huán)境變量的方式與*.sln中不一樣,是$(COCOS2DX_HOME)而非%COCOS2DX_HOME%。

            至此,大工告成!看下面的運(yùn)行起來(lái)的vs工程:

            clip_image003[4]

            圖中依賴的工程跟將新建的項(xiàng)目放在cocos2d-x/projects目錄下面一樣可以鏈接到。

            上面的替換工作可以用文本的查找替換功能,可以輕松搞定。但是為了能夠與create_project.py集成,我提供下面一段代碼能夠自動(dòng)替換.sln.vcxproj文件中對(duì)于內(nèi)容:

             #!/usr/bin/python   

            復(fù)制代碼
            #-*- encoding:utf-8 -*-   

            import sys, os

            def checkOption():
                argLen = len(sys.argv)
                targetPath = "./"
                if argLen == 2:
                    targetPath = sys.argv[1]
                    if not targetPath.endswith("/"):
                        targetPath += "/"
                return targetPath
                
            def replaceCocos2dxPath(path):
                filelists = os.listdir(path)
                for item in filelists:
                    suffix = (os.path.splitext(item))[1]
                    print(suffix)
                    if suffix == ".sln":
                        print('replace "..\..\..\" with %COCOS2DX_HOME% in *.sln')
                        #replace "..\..\..\" with %COCOS2DX_HOME% in *.sln 
                        content = open(path + item, 'r').read().replace("..\\..\\..\\""%COCOS2DX_HOME%\\")
                        file = open(path + item, 'w')
                        file.write(content)
                        file.close()
                    if suffix == ".vcxproj":
                        print('replace "$(ProjectDir)..\..\..\" with $(COCOS2DX_HOME)\ in *.vcxproj')
                        #replace "$(ProjectDir)..\..\..\" with $(COCOS2DX_HOME)\ in *.vcxproj
                        content = open(path + item, 'r').read().replace("$(ProjectDir)..\\..\\..\\""$(COCOS2DX_HOME)\\")
                        file = open(path + item, 'w')
                        file.write(content)
                        file.close()

            if  __name__ == '__main__':
                targetPath = checkOption()
                replaceCocos2dxPath(targetPath)
            復(fù)制代碼

            posted @ 2014-06-04 16:09 多彩人生 閱讀(699) | 評(píng)論 (0)編輯 收藏

            vs2012查找功能失效

            VS"Find in Files"失效的解決方法一:
            讓VS窗口獲得焦點(diǎn),依次按以下快捷鍵
            Ctrl+Break
            Ctrl+Scroll Lock
            Alt+Break


            VS"Find in Files"失效的解決方法二:
            在注冊(cè)表中刪除"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Find"后重啟VS.

            posted @ 2014-05-14 17:02 多彩人生 閱讀(1223) | 評(píng)論 (0)編輯 收藏

            vim 小盒子

            ---------------------------------------------------------------
             gvim 不生成備份文件
             set nobackup

            ---------------------------------------------------------------

            posted @ 2014-03-26 16:22 多彩人生 閱讀(359) | 評(píng)論 (0)編輯 收藏

            中興光貓超級(jí)用戶破解

            打開(kāi)putty工具(百度就可找到), 點(diǎn)擊session,輸入IP ,端口23,選著Telnet 點(diǎn)擊Open, 輸入用戶名root 密碼 Zte521 (密碼一般為“root”、“Zte521”、“telecomadmin”等), 進(jìn)入后輸入sendcmd 1 DB p DevAuthInfo 就可得到telecomadmin超級(jí)用戶的密碼 我的是F612, 密碼放在DevAuthInfo表里,一般光貓是放UserInfo表里 運(yùn)行sendcmd有2種方法: 1.telnet直接運(yùn)行shell的命令。 2.瀏覽器訪問(wèn)http://192.168.1.1/web_shell_cmd.gch 簡(jiǎn)單說(shuō)明:(基本語(yǔ)法) 1.讀取全部表名:sendcmd 1 DB all 輸出所有的表名,我這個(gè)光貓大概有200多個(gè)表。具體設(shè)置在哪里改,需要自己慢慢研究。 2.讀取指定表詳細(xì)信息: sendcmd 1 DB p 表名 比如sendcmd 1 DB p UserInfo,查看路由器帳號(hào)和密碼,超級(jí)密碼也在這里查看,如下圖 2013年01月22日 - 焉逢 - 流年 3.查看當(dāng)前系統(tǒng)運(yùn)行的服務(wù)狀態(tài):sendcmd -pc show 4.修改某個(gè)表的某個(gè)字段的值:sendcmd 1 DB set 表名 行數(shù) 字段名 字段值 比如你要修改上面的那個(gè)超級(jí)密碼:sendcmd 1 DB set UserInfo 0 Password 123456 要修改上面的那個(gè)用戶密碼:sendcmd 1 DB set UserInfo 1 Password 123456就是修改普通戶名密碼為123456 行數(shù)就是 這個(gè)里面No的值,這里是0,下面用戶的行數(shù)那么行數(shù)就是1 字段名就是DM name后面引號(hào)中的名稱,注意大小寫(xiě)。 字段值就是要設(shè)置的值 5.保存對(duì)配置文件的修改:sendcmd 1 DB save 不保存也是可以的,最好保存下。

            posted @ 2014-03-23 17:35 多彩人生 閱讀(11134) | 評(píng)論 (0)編輯 收藏

            關(guān)于定時(shí)器

            http://www.iwms.net/n1251c13.aspx

            定時(shí)器是個(gè)很有意思的東西,它很有用,但我認(rèn)為這不是現(xiàn)代計(jì)算機(jī)的結(jié)構(gòu)所擅長(zhǎng)的事情。
            計(jì)算機(jī)適合做那些很大量的簡(jiǎn)單重復(fù)工作,或者根據(jù)請(qǐng)求做出回應(yīng)。

            DOS時(shí)代是沒(méi)有進(jìn)程線程等概念的,那時(shí)候要想做到定時(shí)真是有些麻煩
            通常的做法是死循環(huán)不斷監(jiān)測(cè)時(shí)間,發(fā)現(xiàn)時(shí)間到了就做特定的事情
            當(dāng)然你可以用delay,來(lái)指定等待多長(zhǎng)時(shí)間,但是如果你一邊要響應(yīng)用戶的操作,比如輸入,一邊要定時(shí)做些
            事情就是一件麻煩的事了

            當(dāng)然有些人可以這樣做,截取系統(tǒng)的時(shí)鐘中斷(我忘了中斷號(hào)是多少了),每秒鐘有18.2次
            當(dāng)這些做法都不是很優(yōu)雅。但DOS時(shí)代只能這樣湊合著了

            Windows是個(gè)偉大的進(jìn)步,系統(tǒng)提供了Timer支持,但是問(wèn)題是這個(gè)定時(shí)器并不準(zhǔn)時(shí)而且有時(shí)候根本不能用。

            Win32 API中有個(gè)SetTimer函數(shù),可以為一個(gè)窗口創(chuàng)建一個(gè)定時(shí)器,這個(gè)定時(shí)器會(huì)定時(shí)產(chǎn)生消息WM_TIMER也可以調(diào)用
            指定的回調(diào)函數(shù),其實(shí)這都是一樣的,因?yàn)槎际菃尉€程的。

            單線程的定時(shí)器會(huì)有很多問(wèn)題,首先是不準(zhǔn)時(shí),定時(shí)器只是定時(shí)把消息WM_TIMER訪到線程的消息隊(duì)列里,但是并不保證消息會(huì)立刻被響應(yīng),如果
            碰巧系統(tǒng)比較忙,那么消息可能會(huì)在隊(duì)列里放一端時(shí)間才被響應(yīng),還會(huì)造成本來(lái)應(yīng)該間隔一段時(shí)間發(fā)生的消息響應(yīng)連續(xù)發(fā)生了

            解決方法通常是

            OnTimer(...)
            {
             //Timer process.....
             
             MSG msg;
             While(PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE));
            }
            在當(dāng)前Timer處理中,把消息隊(duì)列里的WM_TIMER消息,清除掉。

            更糟的是如果你不去調(diào)用GetMessage,那么就不會(huì)有Timer發(fā)生了。
            這個(gè)問(wèn)題直到win xp都沒(méi)什么改變,似乎微軟并不打算在Win32 API中解決這個(gè)問(wèn)題了。

            .NET Framework為我們帶來(lái)了新的解決方案

            .NET Framework提供三種Timer

            Server Timers        System.Timers.Timer
            Thread Timers       System.Threading.Timer
            Windows Timers   System.Windows.Forms.Timer

            其中Windows Timers只是提供了和WinAPI 一樣的Timer,仍然是基于消息,仍然是單線程

            其它兩個(gè)就不同了,他們是基于線程池的Thread Pool,這樣最大的好處在于,產(chǎn)生的時(shí)間間隔準(zhǔn)確均勻。
            Server Timers  和 Thread Timers 的不同在于ServerTimers 是基于事件的,Thread Timers是基于回調(diào)函數(shù)

            我更喜歡Thread Timer,比較輕量級(jí)方便易用。

            但是這樣的Timer也有問(wèn)題,就是由于時(shí)多線程定時(shí)器,就會(huì)出現(xiàn)如果一個(gè)Timer處理沒(méi)有完成,到了時(shí)間下一個(gè)
            照樣會(huì)發(fā)生,這就會(huì)導(dǎo)致重入問(wèn)題

            對(duì)付重入問(wèn)題通常的辦法是加鎖,但是對(duì)于 Timer卻不能簡(jiǎn)單的這樣做,你需要評(píng)估一下

            首先Timer處理里本來(lái)就不應(yīng)該做太需要時(shí)間的事情,或者花費(fèi)時(shí)間無(wú)法估計(jì)的事情,比同遠(yuǎn)方的服務(wù)器建立一個(gè)網(wǎng)絡(luò)連接,這樣的做法盡量避免

            如果實(shí)在無(wú)法避免,那么要評(píng)估Timer處理超時(shí)是否經(jīng)常發(fā)生,如果是很少出現(xiàn),那么可以用lock(Object)的方法來(lái)防止重入
            如果這種情況經(jīng)常出現(xiàn)呢?那就要用另外的方法來(lái)防止重入了

            我們可以設(shè)置一個(gè)標(biāo)志,表示一個(gè)Timer處理正在執(zhí)行,下一個(gè)Timer發(fā)生的時(shí)候發(fā)現(xiàn)上一個(gè)沒(méi)有執(zhí)行完就放棄執(zhí)行

            static  int inTimer = 0;
            public static void threadTimerCallback(Object obj)
            {
                 if ( inTiemr == 0 )
                {
                     inTimer = 1;         

                     Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
                     Thread.Sleep(2000);

                     inTimer = 0;
                  }
            }

            但是在多線程下給inTimer賦值不夠安全,還好Interlocked.Exchange提供了一種輕量級(jí)的線程安全的給對(duì)象賦值的方法

             static int inTimer = 0;
             public static void threadTimerCallback(Object obj)
             {
                   if ( Interlocked.Exchange(ref inTimer, 1) == 0 )
                  {
                       Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
                       Thread.Sleep(250);

                       Interlocked.Exchange(ref inTimer, 0);
                  }
             }

            posted @ 2013-12-18 19:29 多彩人生 閱讀(369) | 評(píng)論 (0)編輯 收藏

            libcurl 多線程使用注意事項(xiàng)

            1、問(wèn)題來(lái)源,多線程使用Libcurl導(dǎo)致程序跑一段時(shí)間后自己退出,沒(méi)有明顯的異常。找不到合適的BUG。

             

            最后通過(guò)查看資料和網(wǎng)上找的一些文章,發(fā)現(xiàn),原來(lái)是信號(hào)處理的問(wèn)題:

             

             

            CURLOPT_NOSIGNAL


            Pass a long. If it is 1, libcurl will not use any functions that install signal handlers or any functions that cause signals to be sent to the process. This option is mainly here to allow multi-threaded unix applications to still set/use all timeout options etc, without risking getting signals. (Added in 7.10)

            If this option is set and libcurl has been built with the standard name resolver, timeouts will not occur while the name resolve takes place. Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals.

            Setting CURLOPT_NOSIGNAL to 1 makes libcurl NOT ask the system to ignore SIGPIPE signals, which otherwise are sent by the system when trying to send data to a socket which is closed in the other end. libcurl makes an effort to never cause such SIGPIPEs to trigger, but some operating systems have no way to avoid them and even on those that have there are some corner cases when they may still happen, contrary to our desire. 

             

            就是當(dāng)多個(gè)線程都使用超時(shí)處理的時(shí)候,同時(shí)主線程中有sleep或是wait等操作。如果不設(shè)置這個(gè)選項(xiàng),libcurl將會(huì)發(fā)信號(hào)打斷這個(gè)wait從而導(dǎo)致程序退出。

             

            所以,在使用的時(shí)候把這個(gè)選項(xiàng)設(shè)置成1就可以了.

            curl_setopt(curl, CURLOPT_NOSIGNAL, 1L);

             

            2、關(guān)于libcurl庫(kù)的初始化和關(guān)閉:curl_global_init()和curl_global_cleanup()

            這兩個(gè)函數(shù)并不是線程安全的。所以只能在主線程中進(jìn)行一次的初始化和清除。

            雖然這個(gè)不是一定就會(huì)有問(wèn)題,但是如果不這樣處理還是有概率發(fā)生的。

            posted @ 2013-12-02 17:16 多彩人生 閱讀(1550) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共25頁(yè): 1 2 3 4 5 6 7 8 9 Last 

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類(lèi)

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            日本道色综合久久影院| 国产精品久久久久影院嫩草| 亚洲国产成人久久综合一| 亚洲中文久久精品无码| 亚洲国产成人精品91久久久| 精品国产婷婷久久久| 欧美亚洲国产精品久久蜜芽| 国内精品久久久久久99| 天天爽天天狠久久久综合麻豆 | 囯产极品美女高潮无套久久久| 人妻无码久久精品| 日本久久中文字幕| 最新久久免费视频| 中文成人久久久久影院免费观看 | 国产69精品久久久久观看软件| 国产三级久久久精品麻豆三级 | 国产精品视频久久久| 影音先锋女人AV鲁色资源网久久 | 久久国产欧美日韩精品| 久久久www免费人成精品| 亚洲成av人片不卡无码久久| 精品一区二区久久| 亚洲αv久久久噜噜噜噜噜| 久久久久九九精品影院| 久久99精品久久久久久| 久久不见久久见免费视频7| 久久久精品人妻一区二区三区蜜桃| 无码人妻久久一区二区三区蜜桃 | 久久夜色tv网站| 精品免费tv久久久久久久| 99久久99久久精品免费看蜜桃| 欧美噜噜久久久XXX| 久久久免费精品re6| 久久国产精品99精品国产| 99久久99这里只有免费费精品 | 日本久久中文字幕| 99精品国产免费久久久久久下载| 一本综合久久国产二区| 97精品依人久久久大香线蕉97| 久久久久久久久久久精品尤物| 久久久99精品成人片中文字幕|