Laden...

Nur eine Instanz des Programms erlauben

Erstellt von blutiger_anfänger vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.016 Views
B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren
Nur eine Instanz des Programms erlauben

Guten Abend liebe CSharp'ler,
ich möchte das mein Programm nur einmal geöffnet werden da, sprich wenn es schon einmal offen ist, soll eine messageBox mit warnung kommen und das Programm wieder geschlossen werden.

Dafür habe ich mir folgendes überlegt:

public void CheckInstanzen()
        {
            string path = Application.ExecutablePath;
            string[] prozessnamen = path.Split('\\');
            Array.Reverse(prozessnamen);
            string prozessname = prozessnamen[0];
            string line = string.Empty;

            StreamWriter sw = File.CreateText(@"data/process.svz");
            Process[] myProcesses = Process.GetProcesses();
            foreach (Process myProcess in myProcesses)
            {
                sw.WriteLine(myProcess.ProcessName);
            }
            sw.Close();

            
            StreamReader sr = File.OpenText(@"data/process.svz");
            while ((line = sr.ReadLine()) != null)
            {
                string line2 = line;
                line2 = line2 + ".EXE";
                if (prozessname == line2)
                {
                    
                    prozessanzahl = prozessanzahl + 1;
                }
            }
            sr.Close();
                    
            
        }

private void Form1_Load(object sender, EventArgs e)
        {
            CheckInstanzen();

            if (prozessanzahl < 1)
            {
                this.ClientSize = new System.Drawing.Size(798, 155);
                CounterSetUP();
                CounterSetUpAll();
                CounterUpdate();
                UpdateCheck();
                tabControl1.Visible = false;
                tabControl1.Controls.Clear();
            }
            else
            {
                MessageBox.Show("Nur eine Instanz erlaubt!");
                Close();
            }
        }

wenn ich mein programm nun einmal über die .exe per doppelklick starte und dann eine zweite instanz per doppelklick öffnen will, passiert garnichts und er öffnet das programm trotzdem zwei mal.

öffne ich die erste instanz per doppelklick und die zweite durch kompilieren im visual studio funktionierts 1A...

Woran liegt das, dass es bei kompilieren hinhaut, später mit der kompiliert .exe aber nciht mehr?!

liebe Grüße,
ich hoffe ich gehe euch nicht zu sehr auf den keks,
ein blutiger_anfänger

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

3.511 Beiträge seit 2005
vor 15 Jahren

Hallo,

siehe hier

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

Ich danke dir! Werde es jetzt so machen, wie unter deinem link beschrieben.

Trotzdem habe ich noch nicht ganz verstanden, warum meine Methode einerseits funktioniert und andererseits nicht...?!
(Das meine Methode schlecht ist, da nicht mit bedacht ist, dass auch andere prozesse so heißen könnten wie meiner, ist mir auch klar) nur warum es halt einmal funktioniert udn einmal nciht, würde mich interessieren...

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

664 Beiträge seit 2005
vor 15 Jahren
3.511 Beiträge seit 2005
vor 15 Jahren

Eigentlich dürfte dein Code nie funktionieren 😉
Aus dem Grund, das du im CheckInstanzen, auf offene Instanzen deines Programmes schaust. Aber in dem Moment, wo duschaust, ist ja schon eine Instanz offen. Ich hoffe du weist was ich meine.

Allerdings verstehe ich etwas nicht: Wozu der Stream? Du erzeugst einemal eine Datei, in dem du die ganzen Prozesse abspeicherst, und um anschliessend alle Prozessnamen in der Datei zu vergleichen. Macht wenig Sinn, meines erachtens. Oder hast du das nur aus Debugzwecken drin? Dann würde es Sinn achen 😉

Achja, und noch etwas: Gewöhne dir sehr schnell ab, für kurzlebige Ergebnisse und Werte einzelne Member in einer Klasse abzulegen. Also


public class Bla
{
  private int m_Anzahl = 0;

  private void BlaBla()
  {
    this.m_Anzahl = 1;
  }

  public void Load()
  {
    BlaBla();
    if (this.m_Anzahl == 1)
     MachWas();
  }
}

Das führt sehr schnell dazu, das du den Überblick verlierst.

Mach es wie folgt


public class Bla
{
  private int BlaBla()
  {
    return 1;
  }

  public void Load()
  {
    if (BlaBla() == 1)
     MachWas();
  }
}

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

das mit den streams war nur zum debuggen... und nun ist mir glaube ich auch aufgefallen warum es überhaupt funktioniert hat... denn wenn man die zweite instanz über visual studio startet... dann sucht danke dem extrahierten wert aus string path = Application.ExecutablePath; wieder nach bla.exe weil die kompilierte exe so heißt, aber solange man es über visual studio startet, heißt der prozess anders als die .exe 😉 (bla.vhost.exe)

naja hat sich ja nun erledigt,
danke euch nochmal!

Wenn ich nicht hier bin, findest du mich auf code-bude.net.