RMBB Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 (endret) 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 3. juli 2014 av RMBB Lenke til kommentar
mobile999 Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 >if (IsProcessOpen = true) if (IsProcessOpen() = true) ? 1 Lenke til kommentar
GeirGrusom Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 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. 2 Lenke til kommentar
RMBB Skrevet 3. juli 2014 Forfatter Del Skrevet 3. juli 2014 (endret) >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 3. juli 2014 av RMBB Lenke til kommentar
RMBB Skrevet 3. juli 2014 Forfatter Del Skrevet 3. juli 2014 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
GeirGrusom Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 (endret) 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 3. juli 2014 av GeirGrusom Lenke til kommentar
mobile999 Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 ouch det må vel uansett stå if(IsProcessOpen()) Lenke til kommentar
delfin Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 (endret) 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 3. juli 2014 av pifler 1 Lenke til kommentar
RMBB Skrevet 3. juli 2014 Forfatter Del Skrevet 3. juli 2014 (endret) 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 3. juli 2014 av RMBB Lenke til kommentar
GeirGrusom Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 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 Lenke til kommentar
delfin Skrevet 3. juli 2014 Del Skrevet 3. juli 2014 (endret) 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 3. juli 2014 av pifler Lenke til kommentar
GeirGrusom Skrevet 4. juli 2014 Del Skrevet 4. juli 2014 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. 1 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå