Gå til innhold

[Løst] Hindre program i å kjøre flere ganger C#


Anbefalte innlegg

Først litt info om hvorfor jeg spør:
Jeg er helt fersk når det kommer til programmering og har startet med å lage et enkelt program for moro skyld. Jeg har vært gjennom diverse tutoirals på youtube og andre sider, men det blir litt tungt i lengden og bare "lese/se" og ikke teste selv. Derfor har jeg satt i gang med et lite program. Så stopper det opp da jeg tydeligvis ikke har nok forståelse, derfor "jukser" jeg litt og spør om hjelp her.

 

Jeg har en kode som jeg har funnet som skal hindre programmet mitt i å kjøre flere ganger. Men jeg vet ikke hvordan jeg skal bruke den.

Her er første del av programmet mitt(Har endret litt på navn):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace Hoved
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Op_Click(object sender, EventArgs e)
        {
            Op O = new Op();
            O.ShowDialog();
            this.Hide();
        }

        private void Ro_Click(object sender, EventArgs e)
        {
            Ro R = new Ro();
            R.ShowDialog();
            this.Hide();
        }

        private void Quit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

    }
}

Dette er koden jeg vil bruke for å kontrollere om programmet allerede kjører:

public bool IsProcessOpen(string name = "Hoved")
        {
            foreach (Process clsProcess in Process.GetProcesses())
            {
                if (clsProcess.ProcessName.Contains(name))
                {
                    return true;
                }
            }
            return false;
        }

Men jeg vet ikke hvordan jeg skal bruke true or false her. Forsøkte å lage en if statement men da fikk jeg beskjed om at IsProcessOpen er en "Method Group"
Forsøkte dette:

public void Feilmelding()
        {
            if (IsProcessOpen = true)
            {
                 MessageBox.Show("Dette programmet er allerede startet!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Noen som kan hjelpe meg?

 

edit: Lagt til C# i Tittel

Endret av RMBB
Lenke til kommentar
Videoannonse
Annonse

Det er en vesentlig enklere måte å få dette til med en mutex:

 

using System;
using System.Threading;
using System.Windows.Forms;

namespace SingleInstance
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var mutex = new Mutex(false, "MyApplication");

            if (mutex.WaitOne(0))
            {
                try
                {
                    Application.Run(new Form1());
                }
                finally
                {
                    mutex.ReleaseMutex();
                }
            }
        }
    }
}
Det er strengt tatt ikke nødvendig med den finally saken.
  • Liker 2
Lenke til kommentar

>if (IsProcessOpen = true)

 

if (IsProcessOpen() = true) ?

if (IsProcessOpen() == true) tok seg av feilmeldingen, men får ikke opp noen meldingsboks når jeg kjører programmet to ganger.

Kan du se hvorfor?

Endret av RMBB
Lenke til kommentar

Det er en vesentlig enklere måte å få dette til med en mutex:

 

using System;
using System.Threading;
using System.Windows.Forms;

namespace SingleInstance
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var mutex = new Mutex(false, "MyApplication");

            if (mutex.WaitOne(0))
            {
                try
                {
                    Application.Run(new Form1());
                }
                finally
                {
                    mutex.ReleaseMutex();
                }
            }
        }
    }
}
Det er strengt tatt ikke nødvendig med den finally saken.

 

Ja, har sett på mutex, men skjønner ikke hvordan jeg skal bruke det. Skjønner dog tydeligvis ikke hvordan jeg bruker det jeg allerede har heller:S

Lenke til kommentar

Du

>if (IsProcessOpen = true)

 

if (IsProcessOpen() = true) ?

if(IsProcessOpen)
Et likhetstegn er assignment. To likhetstegn er sammenligning. Ettersom dette allerede er en bool er det unødvendig å sammenligne den med en annen bool. Endret av GeirGrusom
Lenke til kommentar

Som GeirGrusom sier, mutex

static class Program
{
	static Mutex mx;
	const string singleInstance = @"MU.Mutex";

	[STAThread]
	static void Main(string [] args)
	{
		try
		{
			System.Threading.Mutex.OpenExisting(singleInstance);
			return;
		}
		catch (Exception e)
		{
			mx = new System.Threading.Mutex(true, singleInstance);
		}
		
		Application.Run(new Form1());
	}
}
Men koden til Geir ser fin ut og regner med at den virker :) Endret av pifler
  • Liker 1
Lenke til kommentar

Da fikk jeg det til med mutex! Takk for hjelpen! Ga kred til Geir i og med at han var først ute med mutex svaret.

 

Slik ble det seende ut:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Mittprogram
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static Mutex mx;
        const string singleInstance = @"MU.Mutex";

        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                System.Threading.Mutex.OpenExisting(singleInstance);
                MessageBox.Show("Dette programmet kjører allerede!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            catch (Exception e)
            {
                mx = new System.Threading.Mutex(true, singleInstance);
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Main());
        }
    }
}
Endret av RMBB
Lenke til kommentar

 

Da fikk jeg det til med mutex! Takk for hjelpen! Ga kred til Geir i og med at han var først ute med mutex svaret.

Kan også påpeke at koden jeg skrev ikke inneholder en race condition, og den bruker ikke exceptions for kontrollflyt ;)

 

 

try/finally og exceptions er vel to sider av samme kanin? :)

 

Edit: jeg er dessverre veldig rusten i C#, så det var en ganske generic løsning, men den virket da jeg testet den.. godt mulig den kan forbedres en del :)

Endret av pifler
Lenke til kommentar

 

 

Da fikk jeg det til med mutex! Takk for hjelpen! Ga kred til Geir i og med at han var først ute med mutex svaret.

Kan også påpeke at koden jeg skrev ikke inneholder en race condition, og den bruker ikke exceptions for kontrollflyt ;)

 

 

try/finally og exceptions er vel to sider av samme kanin? :)

 

Edit: jeg er dessverre veldig rusten i C#, så det var en ganske generic løsning, men den virket da jeg testet den.. godt mulig den kan forbedres en del :)

 

Hensikten med try...finally er at dersom programmet skulle kræsje av en eller annen grunn så vil uansett mutexen bli låst opp. finally blir uansett utført samme hva som måtte skje inne i try blokken. Som jeg nevnte er dette strengt tatt ikke nødvendig ettersom operativsystemet vil frigjøre den allikevel, men det er greit å rydde opp etter seg.

 

using(myDisposable) { Foo() } er syntaktisk sukker for dette:

 

 

try
{
  Foo()
}
finally
{
  myDisposable.Dispose();
}

Koden funker den, det er bare at det er et bittelite mellomrom mellom den forventede exception tas imoot hvor det er rom for en ny applikasjon å starte, som gjør at det kan være mulig å få to instanser til å kjøre samtidig. Vanskelig, men det burde være mulig.

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...