日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

第二人生的源碼分析(七十六)判斷程序運(yùn)行多個(gè)實(shí)

系統(tǒng) 2119 0
隨著多任務(wù)系統(tǒng)的流行,可以輕易地把同一個(gè)程序同時(shí)運(yùn)行多個(gè)實(shí)例,這對(duì)于一般的應(yīng)用程序來(lái)說(shuō),是非常有用的,也大大地提高電腦的使用率。但是對(duì)于像第二人生這樣的游戲來(lái)說(shuō),運(yùn)行多個(gè)實(shí)例,是不需要的,也是不現(xiàn)實(shí)的。因?yàn)樗枰浅6嗟? CPU計(jì)算,獨(dú)占CPU還不夠用,別說(shuō)運(yùn)行多個(gè)實(shí)例了,并且它是全屏運(yùn)行的游戲,多個(gè)程序運(yùn)行也不必要。那么第二人生里是使用什么方法來(lái)實(shí)現(xiàn)跨平臺(tái)的多個(gè)實(shí)例運(yùn)行的檢測(cè)呢?下面就來(lái)看看這段代碼:
#001?bool LLAppViewer::anotherInstanceRunning()
#002?{
#003? ?? // We create a marker file when the program starts and remove the file when it finishes.
#004? ?? // If the file is currently locked, that means another process is already running.
#005?
?
獲取作標(biāo)記文件的路徑和名稱(chēng)。
#006? ?? std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME);
#007? ?? llinfos << "Checking marker file for lock..." << llendl;
#008?
?
用只讀的方式打開(kāi)文件。
#009? ?? //Freeze case checks
#010? ?? apr_file_t* fMarker = ll_apr_file_open(marker_file, LL_APR_RB);????
打開(kāi)文件成功,說(shuō)明已經(jīng)存在這個(gè)文件,如果不存在文件,肯定就不存在多個(gè)實(shí)例了。
#011? ?? if (fMarker != NULL)
#012? ?? {
?
說(shuō)明文件已經(jīng)存在,先把只讀方式的文件關(guān)閉。
#013? ?????? // File exists, try opening with write permissions
#014? ?????? apr_file_close(fMarker);
?
用寫(xiě)的方式打開(kāi)這人文件。
#015? ?????? fMarker = ll_apr_file_open(marker_file, LL_APR_WB);
?
如果這樣打開(kāi)文件不成功,說(shuō)明已經(jīng)有一個(gè)實(shí)例已經(jīng)運(yùn)行,因?yàn)榍耙粋€(gè)實(shí)例用只寫(xiě)的方式打開(kāi)文件的。
#016? ?????? if (fMarker == NULL)
#017? ?????? {
#018? ?????????? // Another instance is running. Skip the rest of these operations.
#019? ?????????? llinfos << "Marker file is locked." << llendl;
?
打開(kāi)文件不成功,說(shuō)明已經(jīng)有一個(gè)實(shí)例運(yùn)行。
#020? ?????????? return TRUE;
#021? ?????? }
?
下面鎖住這個(gè)文件,不允許再用寫(xiě)的方式打開(kāi)。
#022? ?????? if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
#023? ?????? {
#024? ?????????? apr_file_close(fMarker);
#025? ?????????? llinfos << "Marker file is locked." << llendl;
#026? ?????????? return TRUE;
#027? ?????? }
#028? ?????? // No other instances; we'll lock this file now & delete on quit.
?
用寫(xiě)的方式能打開(kāi)文件,說(shuō)明沒(méi)有另外的實(shí)例運(yùn)行。
#029? ?????? apr_file_close(fMarker);
#030? ?? }
#031? ?? llinfos << "Marker file isn't locked." << llendl;
#032? ?? return FALSE;
#033?}
?
上面這段代碼是通過(guò)使用一個(gè)不共享寫(xiě)文件的方法來(lái)判斷是否已經(jīng)存在另外一個(gè)實(shí)例,這就是第二人生跨平臺(tái)檢測(cè)是否有第二個(gè)實(shí)例運(yùn)行的方法。
?

第二人生的源碼分析(七十六)判斷程序運(yùn)行多個(gè)實(shí)例


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 青川县| 蓬溪县| 祁连县| 西林县| 红桥区| 武平县| 新蔡县| 安岳县| 禄丰县| 内乡县| 黄石市| 明光市| 嘉定区| 林周县| 乡城县| 淮南市| 韶关市| 六枝特区| 黎川县| 虎林市| 梧州市| 运城市| 会昌县| 沾化县| 九龙县| 吉木乃县| 晋中市| 新余市| 龙门县| 萍乡市| 东兰县| 昭通市| 治县。| 莱州市| 永和县| 元谋县| 卫辉市| 邯郸市| 武威市| 婺源县| 屯留县|