AMcoder - javascript, python, java, html, php, sql

Delphi - Մինչ հանգույց սպառում CPU

Իմ կոդում ես ունեմ մի while հանգույց:

Անկեղծ ասած, ինձ պետք չէ, որ այն լինի նաև while հանգույց, պարզապես շարունակական հանգույց, այնպես որ ընթացակարգի սկզբում ես Բուլյան փոփոխականը սահմանեցի true, այնուհետև ես օգտագործում եմ while BoolVar-ը:

Սա կոնսոլային հավելվածում է, ոչ թե ձևի:

Օղակը ստիպում է հավելվածին սպառել 100% օգտագործում:

Ես օգտագործում եմ քուն (2000); օղակի ներսում:

Ինչպես կարող եմ նվազեցնել պրոցեսորի օգտագործումը: Ցանկացած օգնություն մեծապես գնահատելի է:

while PerRunning do begin
if ProcessExists('FileName.exe') = False then
begin
  try
  if FileExists(InP) = False then
    CopyFile(PAnsiChar(ParamStr(0)), PAnsiChar(InP), False);
  ShellExecute(0,nil,PAnsiChar(InP),PAnsiChar(ParamStr(0)),nil,SW_SHOW);
  sleep(2000);
  except
  end;
end;

վերջ;

function processExists(exeFileName: string): Boolean; 
var 
  ContinueLoop: BOOL; 
  FSnapshotHandle: THandle; 
  FProcessEntry32: TProcessEntry32; 
begin 
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
  Result := False; 
  while Integer(ContinueLoop) <> 0 do begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) 
       or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then begin 
      Result := True; 
    end; 
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
  end; 
  CloseHandle(FSnapshotHandle); 
end; 
21.07.2012

  • Հավանական ProcessExists()-ը վերադարձնում է True, այնպես որ Sleep()-ը երբեք չի գործարկվում 21.07.2012
  • Գործառույթը պրոցեսԳոյություն ունի (exeFileName: string): Բուլյան; var ContinueLoop՝ BOOL; FSnapshotHandle՝ THandle; FProcessEntry32: TProcessEntry32; սկսել FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First (FSnapshotHandle, FProcessEntry32); Արդյունք := Սխալ; իսկ Integer(ContinueLoop) ‹› 0 սկսվում է, եթե ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) կամ (UpperCase(FProcessEntry32.szExeFile) = 21.07.2012
  • UpperCase (ExeFileName))), ապա սկսեք Արդյունքը := True; վերջ; ContinueLoop := Process32Next (FSnapshotHandle, FProcessEntry32); վերջ; CloseHandle (FSnapshotHandle); վերջ; 21.07.2012
  • Ողջույն, եթե ցանկանում եք կոդ ավելացնել, կարող եք խմբագրել ձեր հարցը: Ինչևէ, կարծում եմ, որ մեկը կավելացնի, ամբողջական պատասխան։ Btw, ինչի՞ եք փորձում հասնել: Դա ինչ-որ ծառայություն է, որը կատարվում է: 21.07.2012
  • Օրինակ, ինչպիսի՞ն է գործարկվող EXE ֆայլի կյանքի ցիկլը. այն պե՞տք է մնա ակտիվ, թե՞ կատարում է աշխատանքի միայն որոշ մասը: 21.07.2012
  • Ի պատասխան բոլոր հարցերի: Իմ ծրագիրը ստուգում է ռեեստրում փոփոխությունները և օգտատերերին խնդրում է համաձայնություն ստանալ այս փոփոխությունների համար, դա պարզ պրոակտիվ պաշտպանություն է վիրուսներից: Այսպիսով, ես գործարկում եմ քույր գործընթաց, որը ստուգում է, թե արդյոք հիմնական պրոցեսն աշխատում է, և հիմնական գործընթացը ստուգում է, թե արդյոք քույր գործընթացը աշխատում է... 21.07.2012
  • Էլի օգնություն?? Խնդրում եմ. Ես իսկապես կարիք ունեմ այս ուղղման: :/ 21.07.2012
  • Կարծես թե պարզապես անհրաժեշտ է տեղադրել AV ծրագրակազմ: Ռեեստրի փոփոխությունը միանգամայն նորմալ է: Գրեթե բոլոր ծրագրերը դա անում են: Եվ նման հարցումները ռեեստրի փոփոխությունները հայտնաբերելու միջոց չեն: 21.07.2012
  • Ընդամենը որոշ կողմնակի նշումներ. փոխարենը ստեղծելու ձեր Boolean BoolVar-ը և դնելու այն true-ը, որպեսզի շարունակվի հանգույցը, պարզապես գրեք այն ժամանակ, երբ դա անում է TRUE: Բացի այդ, եթե Արտահայտություն = FALSE, ապա կարող եք գրել, եթե ՈՉ արտահայտություն, ապա: Հնարավոր է, որ դուք արդեն գիտեք դրանք, և դրանք ձեր հարցի պատասխանը չեն, բայց ես մտածեցի, որ կկիսվեմ դրանցով, եթե ձեզ դուր է գալիս, թե ինչպես կարող է մի փոքր մաքրել կոդը: 21.07.2012

Պատասխանները:


1

Ինչպես ասացիք ձեր մեկնաբանության մեջ, դուք ցանկանում եք ստուգել ռեեստրի փոփոխությունները, ուստի ձեր մոտեցումը լավ չէ: Անընդհատ ստուգման համար ժամանակաչափ օգտագործելը լուծում չէ: Windows API-ն սահմանել է ռեեստրի մոնիտորինգի հետ կապված գործառույթների/կեռիկների հատուկ շարք: Նրանք կրակվում են հենց այն ժամանակ, երբ փոփոխություն է կատարվում: Ձեր հավելվածը պարզապես սպասում է փոփոխությունների 0% պրոցեսորի ժամանակով:

Նայեք այս նմուշին. Մոնիտորինգ ռեեստրի փոփոխությունների

Սահմանեք հատուկ թեմա ռեեստրի մոնիտորինգի համար՝ հավելվածի սառեցումը կանխելու համար:

Նաև, գուցե իմաստ ունենա գործարկել ձեր հավելվածը/մասը կամ այն ​​որպես Windows ծառայություն եթե ռեգի փոփոխությունները կարևոր են:

[Խմբագրել]

Դիմումի/գործընթացի մոնիտորինգի մասին դուք պետք է ստանաք գործարկման գործընթացի կարգավորիչը: Եթե ​​այն դուրս չգա, սկսեք այն, ձեռք բերեք Handle և WaitForSingleObject ձեր հավելվածի համար: Որոշ կոդ ոգեշնչման համար: WaitForSingleObject պարզապես սպասեք հավելվածի դադարեցմանը: Դուք կարող եք վերագործարկել այն, եթե դադարեցումը չի վերահսկվում (ելքի կոդը):

Բացի այդ, հաշվի առեք գործարկել ձեր հավելվածը որպես Windows ծառայություն, եթե ցանկանում եք թույլ չտալ օգտվողներին դադարեցնել այն: Այն կաշխատի համակարգի արտոնություններով, և եթե օգտվողը չունի ադմինիստրատորի իրավունքներ, ապա Windows-ը կհրաժարվի դադարեցնել ձեր հավելվածը:

21.07.2012
  • Տղերք, դուք այստեղ կետը բաց եք թողնում, lol.. IDC-ն ռեգիստրի մոնիտորինգի մասին... Ես պարզապես ուզում եմ իմանալ, թե ինչպես նվազեցնել պրոցեսորի սպառումը while Loops-ի միջոցով: Շնորհակալություն 22.07.2012
  • User1512695, ինչպե՞ս եք ակնկալում, որ պրոցեսորի սպառումը (առնվազն մեկ միջուկ) կլինի 100%-ից պակաս, եթե դուք զանգում եք ProcessExists անխափան 22.07.2012
  • Նաև ռեեստրի աղբանոց գրելը հսկայական գործողություն է, որն, իհարկե, խլում է պրոցեսորի մեծ ռեսուրսներ, կարծում եմ, որ նույնիսկ 2 վրկ ընդմիջումը կարող է չափազանց հաճախակի լինել: 22.07.2012

  • 2

    Ես նախկինում ունեի նույն խնդիրը, նույն կոդի վրա: ստեղծել ժմչփ, որը կարող է առաջացնել ստորակետերով բաժանված գործընթացների ցուցակը լայն տողերի մեջ, և որոնել գործընթացի անվանումը՝ փոփոխականում ձեր գործառույթով:

    18.11.2012
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..