本人在開發軟體時需要用到軟體重啟,但是軟體退出時有些清理作業比較慢,重啟時需要等待記憶體清理完成時再重啟?如何實作,謝謝!
目前是軟體退出時呼叫CreateProcess再重新打開軟體,但是現實是有時打開軟體時前面軟體還沒有清理完成!
char pBuf[MAX_PATH];
//獲取應用程式完全路徑,比 GetCurrentDirectory 好用多了
GetModuleFileName(NULL,pBuf,MAX_PATH);
STARTUPINFO startupinfo;
PROCESS_INFORMATION proc_info;
memset(&startupinfo,0,sizeof(STARTUPINFO));
startupinfo.cb=sizeof(STARTUPINFO);
// 最重要的地方
if(TRUE) ::CreateProcess(pBuf,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&startupinfo,&proc_info);
uj5u.com熱心網友回復:
你可以等所有清理作業都完成再呼叫CreateProcess呀否則就要單獨寫一個服務監控當前程式等狀態等到完全退出再把他重啟
uj5u.com熱心網友回復:
軟體退出前 呼叫 創建個全域命名事件或者互斥,達到提示。 清理結束,在最后退出時關閉命名事件/互斥 另一個啟動行程開啟時檢測這個信號事件/互斥存在則等待前一個軟體退出。
uj5u.com熱心網友回復:
這個是不是只把視窗關掉就行了,清理的作業在程式里,清理完了再打開視窗uj5u.com熱心網友回復:
CreateProcess創建一個重啟行程,但是,你必須使用一個行程共享的同步物件來控制是否關閉完成,同步物件在程式進入時馬上創建,在程式的最后,再關閉。uj5u.com熱心網友回復:
用內核物件互斥量CreateMutex即可uj5u.com熱心網友回復:
用另外一個程式 做判斷和啟動
// ExeRestart.cpp
//
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include <shellapi.h>
#include <tlhelp32.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
BOOL FoundProcess (DWORD dwProcessID)
{
BOOL bRet = FALSE;
HANDLE hProcessSnap = NULL;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)};
BOOL bWorking = Process32First(hProcessSnap, &pe32);
while(bWorking)
{
if(dwProcessID == pe32.th32ProcessID)
{
bRet = TRUE;
}
bWorking = Process32Next(hProcessSnap, &pe32);
}
CloseHandle (hProcessSnap);
}
return (bRet);
}
//
//ExeRestart /PID=等待結束的PID /EXE=啟動的EXE程式
int _tmain(int argc, TCHAR* argv[])
{
int iRet = 0;
LPCTSTR szApp = PathFindFileName(argv[0]);
LPCTSTR szPID = NULL, szExe = NULL;
if(argc != 3)
{
_tprintf(_T("Using %s /PID=1234 /EXE=aa.exe\n"), szApp);
}
else
{
szPID = argv[1]+5;
szExe = argv[2]+5;
DWORD dwPID= _tcstoul(szPID, NULL, 10);
if(dwPID != GetCurrentProcessId())
{
while(FoundProcess(dwPID))
{
Sleep(1000);
}
iRet = (int)ShellExecute(NULL, NULL, szExe, NULL, NULL, SW_SHOWNORMAL);
}
}
return iRet;
}
uj5u.com熱心網友回復:
內核物件的基本功能。
uj5u.com熱心網友回復:
sleep就完事uj5u.com熱心網友回復:
清理之前啟動另一個程式啟動這個程式,然后把正在清理的程式視窗隱藏不就OK了轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/73816.html
標籤:進程/線程/DLL
