Avatar billede angelenglen Nybegynder
17. maj 2002 - 11:43 Der er 20 kommentarer og
1 løsning

Overvågning og genstart af program

Jeg mangler et program der kan:
Checke hver X-antal sekunder om program-Y kører.
- Hvis ikke program-Y kører, skal det spørge om du vil annullere automatisk genstart af program-Y, og automatisk genstarte program-Y efter Z-antal sekunder.

følgende variabler skal kunne sættes enten via en eller anden setup, eller en ini-fil:
X sekunder ("refresh"-rate)
Y program (titel på programmet (fx: "Red Faction Dedicated Server"))
Z sekunder (timeout før automatisk genstart)
\
  og en kommando det skal eksekvere ved genstart -ialt 4 variabler.

I mit tilfælde har jeg brug for noget i stil med:
X: 5 sekunder
Y: Red Faction Dedicated Server
Z: 30 sekunder
path: "c:\games\Red Faction\rf.exe -dedicated CTF"

-mit problem er bare at jeg intet kender til at programmere :-( Men jeg har hørt det skulle være ret let at lave et sådan program, so here I am..

heeeeeeeelp :-D

VN Angelenglen
Avatar billede angelenglen Nybegynder
17. maj 2002 - 11:46 #1
-Y Program er naturligvis den titel der skal overvåges efter - ikke titlen på det program jeg mangler.
Avatar billede delwin Nybegynder
17. maj 2002 - 11:47 #2
du må så vidt jeg husker kun oprette spørgsmål 1 gang..
Avatar billede angelenglen Nybegynder
17. maj 2002 - 11:48 #3
og diverse backslashes mangler, da eksperten.dk ser ud til at fjerne dem, men de er heldigvis ikke vigtige...
Avatar billede laffe Nybegynder
17. maj 2002 - 11:50 #4
Ovenstående problem har jeg på følgende måde.

App A er min main app.

App B er minovervågningsapp.

App A. sender en Watchdog message til App B for hver xx sek.

App B. lytter efter Watchdog besked. Hver gang en watchdog modtages, så resetter jeg min watchdog timer.

Hvis watchdog timeren timer ud, så venter jeg i yy sek. hvorefter jeg genstarter app A.


Watchdog beskederne sender jeg som helt almindlige WM_xx beskeder.
Avatar billede angelenglen Nybegynder
17. maj 2002 - 11:54 #5
eeh det forstår jeg ikke noget af (jeg kender ikke noget til at programmere som jeg skrev).
Avatar billede angelenglen Nybegynder
21. maj 2002 - 10:58 #6
Laffe... det er meget godt, men...
redfaction sender ingen beskeder ud.. (jeg har ikke selv skrevet redfaction-programmet.)

Hvad jeg har brug for er et program der kigger efter et program ved navn "Red faction dedicated server" i start-barren... -og så starter det igen  som beskrevet ovenover hvis det ikke kører...

håber der er nogen der kan hjælpe...
Avatar billede angelenglen Nybegynder
22. maj 2002 - 14:42 #7
jeg havde forestillet mig noget i stil med: (det er ikke et screenshot)
http://www.psycotics.dk/images/Program-Monitor.gif
Avatar billede laffe Nybegynder
22. maj 2002 - 14:46 #8
"Exact name of program to monitor", er det caption af vinduet. Hvis det et, så er det meget nemt.
Avatar billede angelenglen Nybegynder
22. maj 2002 - 14:51 #9
hvis caption er det samme som det der står på "knappen" på start-barren, så ja. ligesom der står fx "MSN Messenger" ved et åbent Messenger-vindue, og "Denne Computer" etc etc :)

-så den skal kigge efter et det hedder "Red Faction Dedicated Server" og hvis det ikke existerer, skal den spørge om man virkelig vil starte det igen, og efter en given timeout, skal den så automatisk starte programmet igen. (grunden til at det skal kunne indstilles, er at det så ville kunne bruges til andre programmer i fremtiden. -fx en UT2003 server?)
Avatar billede laffe Nybegynder
22. maj 2002 - 14:56 #10
Jeg kan lave et udkast til dig til i morgen.
Avatar billede angelenglen Nybegynder
22. maj 2002 - 14:59 #11
cool! venter spændt :)
Avatar billede laffe Nybegynder
22. maj 2002 - 22:47 #12
Her er koden til programmet. Det er lavet i CBuilder.

Hvis du vil have en kompileret version så giv mig din mail.



-----> Main.cpp fil

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
#include <stdio.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  FILE *in, *out;

  if ((out = fopen("conf.txt", "wt")) == NULL)
  {
      return;
  }

  fputs(Edit1->Text.c_str(), out);
  fputs("\n", out);
  fputs(Edit2->Text.c_str(), out);
  fputs("\n", out);
  fputs(Edit3->Text.c_str(), out);
  fputs("\n", out);
  fputs(Edit4->Text.c_str(), out);
  fputs("\n", out);
  fclose(out);
  Button1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  FILE *in ;

  if ((in = fopen("conf.txt", "r")) == NULL)
  {
      return;
  }

  char Buffer[512];
  fscanf(in, "%s", Buffer); Edit1->Text = Buffer;
  fscanf(in, "%s", Buffer); Edit2->Text = Buffer;
  fscanf(in, "%s", Buffer); Edit3->Text = Buffer;
  fscanf(in, "%s", Buffer); Edit4->Text = Buffer;
  fclose(in);
  Button1->Enabled = false;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  if (Timer1->Enabled)
  {
    Timer1->Enabled = false;
    Button5->Caption = "Start Monitor";
  }else
  {
    Timer1->Interval = 1000*StrToInt(Edit1->Text);
    Timer1->Enabled = true;
    Button5->Caption = "Stop Monitor";
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  Button1->Enabled = true;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if (Edit3->Text.IsEmpty())
    return;

  if (!FindWindow(NULL,Edit3->Text.c_str()))
  {
    // Window not found. The App is not running.
    Timer2->Interval = 1000*StrToInt(Edit2->Text);
    Timer2->Enabled = true;
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
  PROCESS_INFORMATION ProcessInformation;
  STARTUPINFO StartupInfo;
  bool Result;

  memset(&StartupInfo, 0, sizeof(STARTUPINFO));
  StartupInfo.cb = sizeof(STARTUPINFO);
  // Start Application

  Result = CreateProcess
          (
            Edit4->Text.c_str(),    // pointer to name of executable module
            Edit5->Text.c_str(),  // pointer to command line string
            NULL,                            // pointer to process security attributes
            NULL,                            // pointer to thread security attributes
            false,                            // handle inheritance flag
            0,                                // creation flags
            NULL,                            // pointer to new environment block
            "\\mx\\MX_Process",                  // pointer to current directory name
            &StartupInfo,                        // pointer to STARTUPINFO
            &ProcessInformation                 // pointer to PROCESS_INFORMATION
          );

  Timer2->Enabled = false;

}
//-----------------------------------------------------------------------

----> Main.h fil
//---------------------------------------------------------------------------

#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
  TTabControl *TabControl1;
  TLabel *Label1;
  TEdit *Edit1;
  TEdit *Edit2;
  TLabel *Label2;
  TLabel *Label3;
  TEdit *Edit3;
  TLabel *Label4;
  TEdit *Edit4;
  TButton *Button1;
  TTimer *Timer1;
  TButton *Button5;
  TTimer *Timer2;
  TEdit *Edit5;
  TLabel *Label5;
  void __fastcall Button1Click(TObject *Sender);
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall Button5Click(TObject *Sender);
  void __fastcall Edit1Change(TObject *Sender);
  void __fastcall Timer1Timer(TObject *Sender);
  void __fastcall Timer2Timer(TObject *Sender);
private:    // User declarations
public:        // User declarations
  __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Avatar billede angelenglen Nybegynder
22. maj 2002 - 22:52 #13
jo, mange tak, da jeg ikke selv har en compiler, ville det nok være den bedste løsning...

nighttrain11@hotmail.com
Avatar billede angelenglen Nybegynder
23. maj 2002 - 14:55 #14
Programmet ser for FEDT ud.. der er bare lige 3 ting..
er der mulighed for at man kan tilføge en /autostart eller noget i den stil, så den automatisk går igang med at overvåge lige så snart den er startet? (Så jeg ikke behøver aktivere den på serveren hver gang den har rebootet)

Den ser ikke ud til at gemme "Parameters"-konfigurationen i conf-filen, så den glemmer det.. (det kan jeg dog leve med :-) )

derudover ser den ikke ud til at gøre noget overhovedet... jeg har testet den både med Redfaction, Lommeregner, notepad og scandisk.. den ser ikke ud til at gøre noget overhovedet... (Vil lige nævne at jeg kører winME - kan det være derfor? Skal med glæde opgradere til win2K eller winXP hvis det hjælper)
Avatar billede laffe Nybegynder
23. maj 2002 - 15:20 #15
Ny version er på vej.
Avatar billede laffe Nybegynder
23. maj 2002 - 15:27 #16
Monitor starter automatisk med at monmitere.

Indstillinger bliver gemt.

Nu startes programmet også op efter jeg fjernede en hårdkodning ... Ups.
Avatar billede angelenglen Nybegynder
23. maj 2002 - 15:30 #17
okay, den nye version er meget bedere, idet at den starter programmet korrekt.
Den ser dog stadig ud til at ignorere paramterene (både med hensyn til at gemme konfigurationen, samt at udføre dem når den starter programmet.)
Men hvis det er et progblem, kan jeg omgå det ved at lade den starte en genvejs-fil istedet, så hvis det er et problem, så are lad det være :)
Avatar billede angelenglen Nybegynder
23. maj 2002 - 15:32 #18
-jeg accepterer dit svar nu, da den jo virker :)
Avatar billede laffe Nybegynder
23. maj 2002 - 15:37 #19
Vil du have koden ?
Avatar billede angelenglen Nybegynder
23. maj 2002 - 15:41 #20
jotak, koden ville være rar at have :)
Avatar billede laffe Nybegynder
23. maj 2002 - 15:51 #21
Tak for points :)
Main.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
#include <stdio.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  FILE *in, *out;

  if ((out = fopen("conf.txt", "wt")) == NULL)
  {
      return;
  }

  fputs(Edit1->Text.c_str(), out);
  fputs("\n", out);
  fputs(Edit2->Text.c_str(), out);
  fputs("\n", out);
  fputs(Edit3->Text.c_str(), out);
  fputs("\n", out);
  fputs(Edit4->Text.c_str(), out);
  fputs("\n", out);
  fclose(out);
  Button1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  AnsiString S;
  FILE *in ;

  if ((in = fopen("conf.txt", "r")) == NULL)
  {
      return;
  }

  char Buffer[512];
  fgets(Buffer,512,in);  Buffer[strlen(Buffer)-1] = 0;  Edit1->Text = Buffer;
  fgets(Buffer,512,in);  Buffer[strlen(Buffer)-1] = 0;    Edit2->Text = Buffer;
  fgets(Buffer,512,in);  Buffer[strlen(Buffer)-1] = 0;    Edit3->Text = Buffer;
  fgets(Buffer,512,in);  Buffer[strlen(Buffer)-1] = 0;    Edit4->Text = Buffer;

    /*
  fscanf(in, "%s", Buffer); Edit1->Text = Buffer;
  fscanf(in, "%s", Buffer); Edit2->Text = Buffer;
  fscanf(in, "%s", Buffer); Edit3->Text = Buffer;
  fscanf(in, "%s", Buffer); Edit4->Text = Buffer;
  */
  fclose(in);
  Button1->Enabled = false;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  if (Timer1->Enabled)
  {
    Timer1->Enabled = false;
    Button5->Caption = "Start Monitor";
  }else
  {
    Timer1->Interval = 1000*StrToInt(Edit1->Text);
    Timer1->Enabled = true;
    Button5->Caption = "Stop Monitor";
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  Button1->Enabled = true;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if (Edit3->Text.IsEmpty())
    return;

  if (!FindWindow(NULL,Edit3->Text.c_str()))
  {
    // Window not found. The App is not running.
    Timer2->Interval = 1000*StrToInt(Edit2->Text);
    Timer2->Enabled = true;
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
  PROCESS_INFORMATION ProcessInformation;
  STARTUPINFO StartupInfo;
  bool Result;

  memset(&StartupInfo, 0, sizeof(STARTUPINFO));
  StartupInfo.cb = sizeof(STARTUPINFO);
  // Start Application

  Result = CreateProcess
          (
            Edit4->Text.c_str(),    // pointer to name of executable module
            Edit5->Text.c_str(),  // pointer to command line string
            NULL,                            // pointer to process security attributes
            NULL,                            // pointer to thread security attributes
            false,                            // handle inheritance flag
            0,                                // creation flags
            NULL,                            // pointer to new environment block
            NULL,                  // pointer to current directory name
            &StartupInfo,                        // pointer to STARTUPINFO
            &ProcessInformation                 // pointer to PROCESS_INFORMATION
          );

  Timer2->Enabled = false;

}
//------------------------------------------------------------------------

Main.h

//---------------------------------------------------------------------------

#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
  TTabControl *TabControl1;
  TLabel *Label1;
  TEdit *Edit1;
  TEdit *Edit2;
  TLabel *Label2;
  TLabel *Label3;
  TEdit *Edit3;
  TLabel *Label4;
  TEdit *Edit4;
  TButton *Button1;
  TTimer *Timer1;
  TButton *Button5;
  TTimer *Timer2;
  TEdit *Edit5;
  TLabel *Label5;
  void __fastcall Button1Click(TObject *Sender);
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall Button5Click(TObject *Sender);
  void __fastcall Edit1Change(TObject *Sender);
  void __fastcall Timer1Timer(TObject *Sender);
  void __fastcall Timer2Timer(TObject *Sender);
private:    // User declarations
public:        // User declarations
  __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester