www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]一.概述一些重要的程序,必須讓它一直跑著;而且還要時(shí)時(shí)關(guān)心它的狀態(tài)——不能讓它出現(xiàn)死鎖現(xiàn)象。當(dāng)然,如果一個(gè)主程序會(huì)出現(xiàn)死鎖,肯定是設(shè)計(jì)或者編程上的失誤。我們首要做的事是,把這個(gè)Bug揪出來(lái)。但如果時(shí)間

一.概述
一些重要的程序,必須讓它一直跑著;而且還要時(shí)時(shí)關(guān)心它的狀態(tài)——不能讓它出現(xiàn)死鎖現(xiàn)象。當(dāng)然,如果一個(gè)主程序會(huì)出現(xiàn)死鎖,肯定是設(shè)計(jì)或者編程上的失誤。我們首要做的事是,把這個(gè)Bug揪出來(lái)。但如果時(shí)間緊迫,這個(gè)Bug又“飄忽不定”,那么,我們還是先寫(xiě)一個(gè)“看門(mén)狗”,暫時(shí)應(yīng)一下急吧。

“看門(mén)狗”的需求描述:“看門(mén)狗”的運(yùn)行不出現(xiàn)界面窗口,具有一定的隱蔽性;定時(shí)判斷目標(biāo)進(jìn)程是否運(yùn)行在當(dāng)前系統(tǒng)中,如果沒(méi)有則啟動(dòng)目標(biāo)進(jìn)程;判斷目標(biāo)進(jìn)程是否“沒(méi)有響應(yīng)”,如果是則終止目標(biāo)進(jìn)程;如果目標(biāo)進(jìn)程“沒(méi)有響應(yīng)”的次數(shù)超過(guò)一定的數(shù)量,則將計(jì)算機(jī)系統(tǒng)重啟。

二.預(yù)備知識(shí)
首先要介紹兩個(gè)主要的函數(shù),能夠判斷目標(biāo)進(jìn)程是否“沒(méi)有響應(yīng)”。在User32.dll中(沒(méi)有文檔公開(kāi)),Win2k/NT下的IsHungAppWindow和Win9X下的IsHungThread;前者是以一個(gè)窗口句柄作為參數(shù),后者是以線程ID作為參數(shù)。我們可以通過(guò)VC開(kāi)發(fā)工具的Depends查到這兩個(gè)函數(shù)。
要使用這兩個(gè)函數(shù),我們必須先動(dòng)態(tài)導(dǎo)入,如下:
if (m_hUser32 == NULL)
{
??? m_hUser32 = GetModuleHandle("USER32.DLL");
}
if (m_hUser32)
{
??? m_IsHungNT? = (HUNG_FUNNT) GetProcAddress(m_hUser32, "IsHungAppWindow");
??? m_IsHung9X? = (HUNG_FUN9X) GetProcAddress(m_hUser32, "IsHungThread");
}
另外,還有如下知識(shí)點(diǎn):
1.??? 如何讓窗口隱藏(當(dāng)然通過(guò)Windows任務(wù)管理器還是可以看到的)
在框架窗口類(lèi)的PreCreateWindow中修改窗口風(fēng)格,如下:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
??? if( !CFrameWnd::PreCreateWindow(cs) )
??????? return FALSE;
??? // TODO: Modify the Window class or styles here by modifying
??? //? the CREATESTRUCT cs

??? cs.dwExStyle |= WS_EX_TOOLWINDOW;? // Make invisible in taskbar
??? cs.style????? = WS_POPUP;????????? // Hide the main window

??? return TRUE;
}


2.??? 如何讓“看門(mén)狗”只運(yùn)行一個(gè)進(jìn)程
使用互斥量。在CWatchDogApp::InitInstance()中,執(zhí)行如下代碼:
bool CWatchDogApp::IsUniqueCopyInProc()
{
??? m_Mutex = CreateMutex(NULL, TRUE, "System Watch Dog");
??? if (GetLastError() == ERROR_ALREADY_EXISTS)
??? {
??????? return false;
// 本文轉(zhuǎn)自 C++Builder 研究 -?http://www.ccrun.com/article.asp?i=546&d=b7r01j
??? }
??? return true;
}
該函數(shù)如果返回false,說(shuō)明已經(jīng)有一個(gè)WatchDog進(jìn)程在運(yùn)行了,當(dāng)前進(jìn)程就沒(méi)有必要再執(zhí)行下去了。在InitInstance如下處理:
if (!IsUniqueCopyInProc())
return FALSE;


3.??? 如何判斷當(dāng)前操作系統(tǒng)類(lèi)型
bool CWatchDogApp::IsWinNT()
{?
??? OSVERSIONINFO OSVersionInfo;
??? OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
??? GetVersionEx(&OSVersionInfo);?
??? if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
??? {
??????? return true;
??? }
??? return false;
}


4.??? 如何自動(dòng)重啟計(jì)算機(jī)
在Win9x和Win2k/NT下,重啟計(jì)算機(jī)的處理略有不同:
if (theApp.IsWinNT())
{
??? // 在Win NT/2000下賦予關(guān)閉系統(tǒng)的權(quán)限
??? static HANDLE hToken;
??? static TOKEN_PRIVILEGES tp;
??? static LUID luid;
::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ;
??? ::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
??? tp.PrivilegeCount?????????? = 1;
??? tp.Privileges[0].Luid?????? = luid;
??? tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
??? ::AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
??? return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{
??? return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}


5.??? 如何啟動(dòng)、結(jié)束其他進(jìn)程
啟動(dòng)進(jìn)程用CreateProcess,終止進(jìn)程用TerminateProcess。參考代碼如下:
bool CWatchDogView::RunTheSysProc()
{
??? char??? szPath[MAX_PATH];
??? GetModuleFileName(NULL, szPath, MAX_PATH);
??? CString strPath = szPath;
??? strPath = strPath.Left(strPath.ReverseFind('\')) + "\HungDemo.exe";

??? STARTUPINFO??????????? StartInfo;
??? PROCESS_INFORMATION??? procStruct;
??? memset(&StartInfo,0,sizeof(STARTUPINFO));
??? StartInfo.cb = sizeof(STARTUPINFO);

??? if (!::CreateProcess(
??????? (LPCTSTR) strPath,
??????? NULL,
??????? NULL,
??????? NULL,
??????? FALSE,
??????? NORMAL_PRIORITY_CLASS,
??????? NULL,
??????? NULL,
??????? &StartInfo,
??????? &procStruct))
??????? return false;
??? return true;
}
需要提醒的是,TerminateProcess是在萬(wàn)不得已的情況下使用的,它不會(huì)進(jìn)入進(jìn)程使用的DLL的入口點(diǎn)通知“脫離”(Detaching)狀態(tài)。有時(shí)候,這樣做是很危險(xiǎn)的(DLL內(nèi)部的全局?jǐn)?shù)據(jù)可能受影響較大)。


6.定時(shí)檢測(cè)子進(jìn)程的運(yùn)行情況代碼如下:
void CWatchDogView::OnTimer(UINT nIDEvent)?
{
?// Get the target window handle
?HWND??? hTarget = ::FindWindow(NULL, "抄表數(shù)據(jù)庫(kù)維護(hù)");
?DWORD?? dwProcessID, dwThreadID;
?dwThreadID = ::GetWindowThreadProcessId(hTarget, &dwProcessID);
?
?// The Target window found, the verify the whether responding
?if (hTarget)??
?{
??//這里我處理得簡(jiǎn)單了一點(diǎn),源程序還加了重新啟動(dòng)機(jī)器等處理
??}
?else
?{???????
??//如果沒(méi)有檢測(cè)到所監(jiān)視的子進(jìn)程在運(yùn)行,則重新啟動(dòng)子進(jìn)程(也就是自己想要被監(jiān)視的程序)
??RunTheSysProc();
?????????????????
?}?

?CView::OnTimer(nIDEvent);
}

7.??? 如何讓W(xué)in2k/NT自動(dòng)登錄
修改注冊(cè)表。在HKEY_LOCAL_MACHINE目錄下的SoftwareMicrosoftWindows NT CurrentVersionWinLogon下的AutoAdminLogon(字符串型)設(shè)置成1,并在DefaultUserName設(shè)置默認(rèn)登錄用戶,DefaultPassword設(shè)置默認(rèn)用戶的密碼。

8.??? 如何讓W(xué)in2k/NT登錄成功后直接執(zhí)行你的程序(而不是默認(rèn)的文件瀏覽器)
修改注冊(cè)表。在注冊(cè)表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NT CurrentVersionWinlogonShell的值從原先的explorer.exe修改為自己程序的絕對(duì)路徑。

三.功能演示(Win2k/NT下)
友情提醒:開(kāi)始演示之前,請(qǐng)先將你目前的工作保存。運(yùn)行“看門(mén)狗”WatchDog;同時(shí)使用Ctrl+Alt+Del打開(kāi)“Windows任務(wù)管理器”。稍候片刻,可以看到目標(biāo)程序HungDemo會(huì)被啟動(dòng)(這個(gè)程序模擬了“沒(méi)有響應(yīng)”)。然后,WatchDog發(fā)現(xiàn)這個(gè)程序“沒(méi)有響應(yīng)”,則把它殺掉,然后重新啟動(dòng)一個(gè)新的HungDemo進(jìn)程。如此的處理重復(fù)六次以后,系統(tǒng)會(huì)自動(dòng)重啟。


以上是我從網(wǎng)上摘下來(lái)的一篇關(guān)于軟件看門(mén)狗的文章,我只是在原文的基礎(chǔ)上加以修改,以便于像我這樣的初學(xué)者更容易理解。對(duì)于像我樣的新手來(lái)說(shuō),其中的很多東西我還是不怎么懂,像GetModuleHandle(),GetProcAddress()之類(lèi)的函數(shù),我不明白深層次的意思,我也不知道怎么修改注冊(cè)表。

????? 其實(shí)這些功能我都沒(méi)有用,我只用到了讓程序在出錯(cuò)的情況下能自動(dòng)重啟。沒(méi)有讓機(jī)器重啟,因?yàn)槲矣X(jué)得如果讓機(jī)器重啟的話,可能還會(huì)遇到很多問(wèn)題,比如開(kāi)機(jī)密碼之類(lèi)的。其實(shí)作者講述的已經(jīng)挺明白的了,按照他的講述加上自己閱讀源程序,相信大家都能把它修改成自己想要的程序。其實(shí),我覺(jué)得,要實(shí)現(xiàn)看門(mén)狗這個(gè)功能,最主要的是理解CreateProcess((LPCTSTR)strPath,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartInfo,&procStruct))函數(shù)和::FindWindow(NULL, "自己的程序名稱(chēng)")這兩個(gè)函數(shù)。其中,CreateProcess函數(shù)主要是創(chuàng)建一個(gè)子進(jìn)程,就是被看門(mén)狗監(jiān)視的那個(gè)程序,修改程序時(shí),只要把HungDemo.exe改成自己程序的exe就行了。而::FindWindow函數(shù)主要是用來(lái)得到子進(jìn)程的窗口句柄,以便用來(lái)判斷被監(jiān)視的程序是否已經(jīng)退出。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

中國(guó) 北京,2025 年 8 月 28 日 —— 全球領(lǐng)先的數(shù)學(xué)計(jì)算軟件開(kāi)發(fā)商 MathWorks 今日宣布,香港中文大學(xué)(下文簡(jiǎn)稱(chēng):港中大)一支研究團(tuán)隊(duì)采用 MATLAB?、Medical Imaging Toolbo...

關(guān)鍵字: 生物醫(yī)學(xué) 計(jì)算機(jī)

加利福尼亞州圣克拉拉 — 2025 年 8 月 25 日 — NVIDIA 今日宣布 NVIDIA Jetson AGX Thor? 開(kāi)發(fā)者套件和量產(chǎn)級(jí)模組現(xiàn)已發(fā)售。這是一款功能強(qiáng)大的新一代機(jī)器人計(jì)算機(jī),旨在為制造、物流...

關(guān)鍵字: 機(jī)器人 計(jì)算機(jī) AI

在嵌入式系統(tǒng)開(kāi)發(fā)中,看門(mén)狗(Watchdog Timer, WDT)是保障系統(tǒng)可靠性的核心組件,其初始化時(shí)機(jī)的選擇直接影響系統(tǒng)抗干擾能力和穩(wěn)定性。本文從硬件架構(gòu)、軟件流程、安全規(guī)范三個(gè)維度,系統(tǒng)分析看門(mén)狗初始化的最佳實(shí)踐...

關(guān)鍵字: 單片機(jī) 看門(mén)狗 嵌入式系統(tǒng)

在這篇文章中,小編將對(duì)PLC的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來(lái)閱讀以下內(nèi)容吧。

關(guān)鍵字: PLC 模塊化 程序

北京2025年8月18日 /美通社/ -- 2025年8月,軟通動(dòng)力集團(tuán)一項(xiàng)關(guān)鍵決策引發(fā)行業(yè)矚目——以自有資金8億元向全資子公司軟通計(jì)算機(jī)有限公司完成實(shí)繳增資,使其注冊(cè)資本增加至23億元。這筆戰(zhàn)略注資不僅彰顯集團(tuán)對(duì)信創(chuàng)核...

關(guān)鍵字: AI 硬件 計(jì)算機(jī) 智能化

北京2025年7月31日 /美通社/ -- 近日,權(quán)威咨詢機(jī)構(gòu)德本咨詢重磅發(fā)布"2025中國(guó)信創(chuàng)PC市場(chǎng)影響力品牌TOP 10"榜單。軟通計(jì)算機(jī)憑借其迅猛的發(fā)展勢(shì)頭、領(lǐng)先的技術(shù)整合能力及顯著的市場(chǎng)表現(xiàn)...

關(guān)鍵字: 計(jì)算機(jī) TOP PC PC市場(chǎng)

我想把整個(gè)紅外數(shù)據(jù)庫(kù),數(shù)千個(gè)遠(yuǎn)程文件分布在數(shù)百個(gè)文件夾中,打包到一個(gè)手持設(shè)備中。

關(guān)鍵字: 紅外通信 M5Stack 計(jì)算機(jī)

工控機(jī),全稱(chēng)為工業(yè)控制計(jì)算機(jī),是一種專(zhuān)為工業(yè)環(huán)境設(shè)計(jì)并制造的計(jì)算機(jī)設(shè)備。為增進(jìn)大家對(duì)工控機(jī)的認(rèn)識(shí),本文將對(duì)工控機(jī)的選擇方法予以介紹,以便大家在選擇工控機(jī)時(shí)有所依據(jù)。如果你對(duì)工控機(jī)具有興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: 工控機(jī) 指數(shù) 計(jì)算機(jī)

為增進(jìn)大家對(duì)工控機(jī)的認(rèn)識(shí),本文將對(duì)工控機(jī)的變成方法以及工控機(jī)對(duì)設(shè)備的控制予以介紹。

關(guān)鍵字: 工控機(jī) 指數(shù) 計(jì)算機(jī)

6月12日消息,據(jù)媒體報(bào)道,美國(guó)賓夕法尼亞州立大學(xué)領(lǐng)導(dǎo)的研究團(tuán)隊(duì)首次利用二維材料成功制造出一臺(tái)可執(zhí)行簡(jiǎn)單操作的計(jì)算機(jī)。這一突破為開(kāi)發(fā)更薄、更快、更節(jié)能的電子產(chǎn)品奠定了重要基礎(chǔ)。

關(guān)鍵字: 非硅二維材料 計(jì)算機(jī)
關(guān)閉