全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3010
推到 Plurk!
推到 Facebook!

記憶體溢出

答題得分者是:ikk
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-02-05 17:27:13 IP:122.146.xxx.xxx 訂閱
 請問各位大大,小弟的程式出了一個問題,

就是程式在執行中的時候會一直出現錯誤(Project Project1.exe raised exception class EStackOverflow with message 'Stack overflow')

布過我都是使用string Astr[40]來幫全域變數,而且也檢查過了並沒有超出陣列範圍,布過執行到一半時,還是會跳出這個錯誤訊息,

還是有其他原因呢?


hdilwy
初階會員


發表:18
回覆:65
積分:41
註冊:2004-08-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-02-06 10:19:21 IP:219.81.xxx.xxx 訂閱
1.檢查宣告是否在迴圈內
2.檢查程式裡頭是否有遞迴呼叫

我想到檢查的項目只有這兩點,請其他先進補充@@"
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-02-06 11:04:27 IP:122.146.xxx.xxx 訂閱
 我好像找到問題所在了!

就是我使用

String s= "C:\\Program Files\\Microsoft Office\\Office10\\WINWORD.EXE";
DWORD rt;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb=sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if(!CreateProcess(NULL,s.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
ShowMessage("CreateProcess failed!" IntToStr(GetLastError()));
}
do
{ //修改成do while迴圈來等待
rt = WaitForSingleObject(pi.hProcess, 0); //這裡不等待
Application->ProcessMessages();
Sleep(100);
}
while( rt == WAIT_TIMEOUT); //是否timeout?
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
ShowMessage("WinWord terminate!");

這個方法來開檔,就是它會等程式結束後才繼續執行下去,布過我會一直去RUN這段程式,所以可能會變成卡住了,所以當我把開檔改成Winexec後,就沒有這個問題,

布過這樣又無法判斷程式是否執行完畢,請問大大還有別的方法嗎??

hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-02-06 17:25:56 IP:122.146.xxx.xxx 訂閱
 我後來改變了作法,

布過想請問有沒有辦法可以直接判斷此執行檔是否執行完畢

FindWindow("TAPPLICATION",("RAM_TEST")

此指令好像只能判斷視窗名稱是否執行完畢,

布過如果執行檔的檔名跟視窗名稱不同,就無法判斷

請問一下,有沒有可以直接判斷執行檔的檔名是否執行完畢,謝謝!!
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-02-09 10:26:23 IP:163.28.xxx.xxx 訂閱
可參考以下link
http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=72663

key word
GetExitCodeProcess
------
FPGA驗證, FPGA開發平台, http://smims.com
編輯記錄
ikk 重新編輯於 2009-02-09 10:27:13, 註解 無‧
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-02-09 12:42:25 IP:122.146.xxx.xxx 訂閱
 
這位大大,由於使用此種方式開檔,因為會被Hold住,會照成程式執行到一半時記憶體異位,

所以無法使用,有沒有辦法是,可以直接判斷EXE檔是否執行完畢呢??
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-02-09 12:51:21 IP:163.28.xxx.xxx 訂閱

[code cpp]
BOOL GetProcessList( )
{
  HANDLE hProcessSnap;
  HANDLE hProcess;
  PROCESSENTRY32 pe32;
  DWORD dwPriorityClass;

  // Take a snapshot of all processes in the system.
  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
    return( FALSE );
  }

  // Set the size of the structure before using it.
  pe32.dwSize = sizeof( PROCESSENTRY32 );

  // Retrieve information about the first process,
  // and exit if unsuccessful
  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    printError( TEXT("Process32First") ); // show cause of failure
    CloseHandle( hProcessSnap );          // clean the snapshot object
    return( FALSE );
  }

  // Now walk the snapshot of processes, and
  // display information about each process in turn
  do
  {
    printf( "\n\n=====================================================" );
    _tprintf( TEXT("\nPROCESS NAME:  %s"), pe32.szExeFile );
    printf( "\n-----------------------------------------------------" );


  } while( Process32Next( hProcessSnap, &pe32 ) );

  CloseHandle( hProcessSnap );
  return( TRUE );
}

[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-02-09 13:35:33 IP:122.146.xxx.xxx 訂閱

請問一下,像這樣要如何使用呢?

直接複製貼上好像不行,還有EXE檔的路徑是要寫在哪裡呢??

謝謝大大~~~
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-02-10 12:20:46 IP:122.146.xxx.xxx 訂閱

還是請問,使用以下來開檔,只要在程式中使用次數一多,就會顯示錯誤訊息!(Project Project1.exe raised exception class EStackOverflow with message 'Stack overflow')

有辦法改變嗎??

勞煩各位大大了~~~
String Button2="C:\\WTESTELL\\" Str[0].Trim();
if(!CreateProcess(NULL,Button2.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
BitBtn2->Font->Style=TFontStyles();
BitBtn2->Font->Color=clRed;
BitBtn2->Caption="NULL";
}
do
{ //修改成do while迴圈來等待
rt = WaitForSingleObject(pi.hProcess, 0); //這裡不等待
Application->ProcessMessages();
Sleep(100);
}
while( rt == WAIT_TIMEOUT); //是否timeout?
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-02-10 15:43:53 IP:122.146.xxx.xxx 訂閱
從前輩們的程式中我找到了一篇比較符合我的功能


[code cpp]


bool __fastcall TForm1::KillTask(String ExeFileName)
{
bool ContinueLoop;
HANDLE FSnapshotHandle;
PROCESSENTRY32 FProcessEntry32;
int result= 0;
FSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize = sizeof(FProcessEntry32);
ContinueLoop = Process32First(FSnapshotHandle,&FProcessEntry32);
while(ContinueLoop !=0)
{
if((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) == UpperCase(ExeFileName))||(UpperCase(FProcessEntry32.szExeFile) == UpperCase(ExeFileName)))
result = (int)TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, FProcessEntry32.th32ProcessID), 0);
ContinueLoop = Process32Next(FSnapshotHandle, &FProcessEntry32);
}
CloseHandle(FSnapshotHandle);
return result;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool fg= KillTask(Edit1->Text);
if(fg) ShowMessage("指定的檔案已關閉...");
else ShowMessage("找不到指定的檔案?");
}

[/code]

布過執行完畢後找到的執行檔會自動關閉,如果我不想把它自動關閉,請問大大們,我要如何修改呢?

編輯記錄
hank73317 重新編輯於 2009-02-10 15:45:09, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-02-10 15:53:03 IP:163.28.xxx.xxx 訂閱

TerminateProcess --> 終止程式
------
FPGA驗證, FPGA開發平台, http://smims.com
hank73317
一般會員


發表:20
回覆:47
積分:13
註冊:2008-12-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-02-12 09:48:17 IP:122.146.xxx.xxx 訂閱
可以了~~~~~謝謝這位大大~~~~

系統時間:2024-11-23 3:59:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!