• <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>

            旅途

            如果想飛得高,就該把地平線忘掉

            一個(gè)后臺(tái)運(yùn)行程序的簡(jiǎn)單設(shè)計(jì)

            很多時(shí)候,我們都會(huì)遇到編寫后臺(tái)運(yùn)行程序的問(wèn)題。編寫后臺(tái)運(yùn)行程序的主要工作并不在接口上,而是在其作為服務(wù)器程序所完成的實(shí)際工作上。由于編寫過(guò)不少后臺(tái)工作程序,最初總是為程序的后臺(tái)工作接口而苦惱不已。在這里,我貼出相關(guān)的代碼,相信根據(jù)此設(shè)計(jì),讀者可以輕易地把它應(yīng)用到自己的后臺(tái)程序中去。

            假設(shè)程序名稱為startup,那么程序啟動(dòng)的接口為:

            Startup:? 啟動(dòng)該程序???
            Startup -v: 查看該程序的版本
            Startup -d: 啟動(dòng)該程序,并將調(diào)試信息打印到debug文件中
            Startup -h: 以后臺(tái)方式啟動(dòng)應(yīng)用程序
            Startup -k: 停止后臺(tái)應(yīng)用程序的運(yùn)行
            Startup -l: 重新讀取應(yīng)用程序的配置文件

            配置文件(startup.ini)的格式如下:
            [SERVER]
            DEBUG = 1

            完整的實(shí)現(xiàn)如下:

            Startup.h

            #ifndef?_STARTUP_H_
            #define ?_STARTUP_H_

            #define ?MAX_MSG_SIZE????????????????1500
            #define ?MAX_BUFFER_LEN????????????????1024
            #define ?MIN_BUFFER_LEN????????????????256
            #define ?MAX_FILE_NAME_LEN????????????MAX_BUFFER_LEN

            #define ?CFG_PATH????????????????????"Startup.ini"

            void ?loadConfig();
            void ?mprintf( const ? char ? * pszFormat,...);

            #endif

            Startup.cpp

            #include? " Startup.h "
            #include?
            < stdlib.h >
            #include?
            < Windows.h >

            #include?
            < iostream >

            using ? namespace ?std;

            HANDLE????hExitHandle????
            = ? 0 ;
            HANDLE????hLoadHandle????
            = ? 0 ;
            int ????????nDbgInfoPrt???? = ? 0 ;

            int ?main( int ?argc,? char * ?argv[])
            {
            ????
            if ?(argc? > ? 2 )
            ????
            {
            ????????cout?
            << ? " Error,?print?"Startup?-help"?for?usage. " ? << ?endl;
            ????????
            return ? 0 ;
            ????}


            ????
            if ?(argc? == ? 2 ? && ?strcmp(argv[ 1 ],? " -help " )? == ? 0 )
            ????
            {
            ????????cout?
            << ? " Usage:?Startup?for?starting?up?test. " ? << ?endl;
            ????????cout?
            << ? " ------------------------------------------- " ? << ?endl;
            ????????cout?
            << ? " Startup:????Start?the?application. " ? << ?endl;
            ????????cout?
            << ? " Startup?-v:?View?the?version. " ? << ?endl;
            ????????cout?
            << ? " Startup?-d:?Start?the?application?in?debug?mode. " ? << ?endl;
            ????????cout?
            << ? " Startup?-h:?Start?the?application?in?hide?mode. " ? << ?endl;????????
            ????????cout?
            << ? " Startup?-k:?Stop?the?application?running?in?hide?mode. " ? << ?endl;
            ????????cout?
            << ? " Startup?-l:?Reload?the?config?when?running?in?hide?mode. " ? << ?endl;
            ????????
            return ? 0 ;
            ????}


            ????
            if ?(argc? == ? 2 ? && ?strcmp(argv[ 1 ],? " -v " )? == ? 0 )
            ????
            {
            ????????cout?
            << ? " Startup?v1.0?for?starting?up?test " ? << ?endl;
            ????????
            return ? 0 ;
            ????}


            ????
            if ?(argc? == ? 2 ? && ?strcmp(argv[ 1 ],? " -d " )? == ? 0 )
            ????
            {
            ????????nDbgInfoPrt?
            = ? true ;
            ????????mprintf(
            " Run?application?in?debug?mode! " );
            ????}


            ????
            if ?(argc? == ? 2 ? && ?strcmp(argv[ 1 ],? " -h " ?)? == ? 0 )
            ????
            {
            ????????
            // Run?the?program?background
            ???????? char ?szPath[MAX_PATH]? = ? {? 0 ?} ;
            ????????STARTUPINFO?si;
            ????????PROCESS_INFORMATION?pi;

            ????????ZeroMemory(
            & si,? sizeof (si));
            ????????si.cb?
            = ? sizeof (si);
            ????????ZeroMemory(
            & pi,? sizeof (pi));

            ????????GetModuleFileName(NULL,?(LPWCH)szPath,?MAX_PATH);
            ????????
            if ?( ! CreateProcess(NULL,???????????????? // ?No?module?name?(use?command?line).?
            ???????????????????????????(LPWSTR)szPath,???????? // ?Command?line.?
            ???????????????????????????NULL,???????????????? // ?Process?handle?not?inheritable.?
            ???????????????????????????NULL,???????????????? // ?Thread?handle?not?inheritable.?
            ???????????????????????????FALSE,???????????????? // ?Set?handle?inheritance?to?FALSE.?
            ???????????????????????????CREATE_NO_WINDOW,???? // ?No?creation?flags.?
            ???????????????????????????NULL,???????????????? // ?Use?parent's?environment?block.?
            ???????????????????????????NULL,???????????????? // ?Use?parent's?starting?directory.?
            ??????????????????????????? & si,???????????????????? // ?Pointer?to?STARTUPINFO?structure.
            ??????????????????????????? & pi)???????????????????? // ?Pointer?to?PROCESS_INFORMATION?structure.
            ????????????)?
            ????????
            {
            ????????????cout?
            << ? " Failed?in?starting?application,?error?code:? " ? << ?GetLastError()? << ?endl;
            ????????}


            ????????
            return ? 0 ;
            ????}
            ????

            ????
            if ?(argc? == ? 2 ? && ?strcmp(argv[ 1 ],? " -k " )? == ? 0 )
            ????
            {
            ????????hExitHandle?
            = ?OpenEvent(EVENT_ALL_ACCESS,?FALSE,?(LPCWSTR) " StartupKill " );
            ????????
            if ?(NULL? == ?hExitHandle)
            ????????
            {
            ????????????mprintf(
            " Can't?open?kill?event " );????????????
            ????????????
            return ? 0 ;
            ????????}


            ????????SetEvent(hExitHandle);
            ????????
            return ? 0 ;
            ????}


            ????
            if ?(argc? == ? 2 ? && ?strcmp(argv[ 1 ],? " -l " )? == ? 0 )
            ????
            {
            ????????hLoadHandle?
            = ?OpenEvent(EVENT_ALL_ACCESS,?FALSE,?(LPCWSTR) " StartupLoad " );
            ????????
            if ?(NULL? == ?hLoadHandle)
            ????????
            {
            ????????????mprintf(
            " Can't?open?load?event " );????????????
            ????????????
            return ? 0 ;
            ????????}


            ????????SetEvent(hLoadHandle);
            ????????
            return ? 0 ;
            ????}


            ????hExitHandle?
            = ?CreateEvent(NULL,?TRUE,?FALSE,?(LPCWSTR) " StartupKill " );
            ????
            if ?(NULL? == ?hExitHandle)
            ????
            {
            ????????mprintf(
            " Can't?create?kill?event " );
            ????????
            return ? 0 ;
            ????}


            ????hLoadHandle?
            = ?CreateEvent(NULL,?TRUE,?FALSE,?(LPCWSTR) " StartupLoad " );
            ????
            if ?(NULL? == ?hLoadHandle)
            ????
            {
            ????????mprintf(
            " Can't?create?load?event " );
            ????????
            return ? 0 ;
            ????}


            ????
            if ?(GetLastError()? == ?ERROR_ALREADY_EXISTS)
            ????
            {
            ????????cout?
            << ? " Application?has?already?started. " ? << ?endl;
            ????????
            return ? 0 ;
            ????}


            ????
            // ?load?the?configure?information
            ????loadConfig();

            ????
            for ?(?;?;?)
            ????
            {
            ????????
            if ?(WaitForSingleObject(hExitHandle,? 0 )? != ?WAIT_TIMEOUT)
            ????????
            {
            ????????????
            break ;
            ????????}
            ????

            ????????
            if ?(WaitForSingleObject(hLoadHandle,? 0 )? != ?WAIT_TIMEOUT)
            ????????
            {
            ????????????loadConfig();
            ????????}

            ??
            ????????
            // ?TODO:?do?something?here
            ????????mprintf( " The?program?is?alive! " );

            ????????Sleep(
            1000 );
            ????}


            ????CloseHandle(hExitHandle);
            ????CloseHandle(hLoadHandle);

            ????
            return ? 0 ;
            }


            ///////////////////////////////////////////////////
            //
            // ?Description:?load?the?configure?from?.ini?file
            // ?
            // ?Parameter:?
            // ????void?==?
            //
            // ?Return:
            // ????void?==
            //
            ///////////////////////////////////////////////////

            void ?loadConfig()
            {
            ????
            // ?Get?the?configure?info?from?Startup.ini????
            ????nDbgInfoPrt? = ?GetPrivateProfileInt((LPCWSTR) " SERVER " ,?(LPCWSTR) " DEBUG " ,????? 0 ,????(LPCWSTR)CFG_PATH);
            }



            ///////////////////////////////////////////////////
            //
            // ?Description:?print?the?msg
            // ?
            // ?Parameter:?
            // ????const?char?*pszFormat?==?
            //
            // ?Return:
            // ????void?==
            //
            ///////////////////////////////////////////////////

            void ?mprintf( const ? char ? * pszFormat,...)
            {
            ????
            if ?( ! nDbgInfoPrt)
            ????
            {
            ????????
            return ;
            ????}


            ????va_list?vaArg;
            ????va_start(vaArg,?pszFormat);????

            ????
            char ?szDbgInfo[MAX_BUFFER_LEN? + ? 1 ]? = ? { 0 ,?} ;
            ????vsprintf_s(szDbgInfo,?pszFormat,?vaArg);

            ????va_end(vaArg);

            ????cout?
            << ?szDbgInfo? << ?endl;
            }

            ?



            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1472147

            posted on 2007-08-09 00:49 旅途 閱讀(1901) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 深入windows

            色婷婷久久综合中文久久一本| 99999久久久久久亚洲| 99久久免费国产精品特黄| 伊人久久成人成综合网222| 久久亚洲精精品中文字幕| 日韩精品国产自在久久现线拍| 久久久精品国产Sm最大网站| 色综合久久久久久久久五月 | 久久国产乱子伦精品免费午夜| 婷婷久久综合| 久久精品国产亚洲一区二区| 狠狠色婷婷久久一区二区| 色综合久久最新中文字幕| 国内精品综合久久久40p| 国产激情久久久久影院老熟女| 无码八A片人妻少妇久久| 精品乱码久久久久久夜夜嗨| 国产精品久久久久jk制服| 久久精品国产精品亚洲精品| 久久久久99精品成人片牛牛影视| 精品久久久久久久久午夜福利| 日韩欧美亚洲综合久久| 久久久久久久亚洲精品| 精品国产福利久久久| 久久国产精品99精品国产| 亚洲精品乱码久久久久久蜜桃图片| 国产精品久久久99| 国产成人久久久精品二区三区 | 亚洲中文久久精品无码| 欧美日韩久久中文字幕| 亚洲国产成人精品91久久久| 久久www免费人成精品香蕉| 久久精品国产99久久丝袜| 91精品国产高清久久久久久91| 精品久久久久久综合日本| 国产一级持黄大片99久久| 国产精品久久久久久久久免费| 久久亚洲高清观看| 久久99久久成人免费播放| 久久综合色老色| 亚洲精品美女久久777777|