Avatar billede mysitesolution Nybegynder
11. august 2005 - 16:37 Der er 53 kommentarer og
2 løsninger

Holde app. kørende

hej...

hhm... har lavet en lille app der laver et tray ikon med menu... den forsvinder hurtigt igen og programmet lukker pga. den jo får løbet alt kode igennen...

Hvad kan man gøre ved det`? skal være noget der ikke fyrer op for cpuen...
Avatar billede anadan Nybegynder
11. august 2005 - 16:52 #1
Thread.Sleep(10000); //venter tid i millisek
Console.ReadLine(); //venter til du trykker ENTER
Avatar billede mysitesolution Nybegynder
11. august 2005 - 21:26 #2
Er ikke en tråd, og så lukker den også, bare efter lang tid...

Er ikke en konsol app, så vil ikke fyrer det ind
Avatar billede mysitesolution Nybegynder
11. august 2005 - 22:36 #3
Har løst det...

brugte godtnok sleep, fordi jeg lavede det til en tråd hhm...

opret svar
Avatar billede mysitesolution Nybegynder
11. august 2005 - 22:41 #4
eller nej gjorde det ikke... nu blokere den for programmet hhm...
Avatar billede Lasse Novice
11. august 2005 - 23:17 #5
du er ALTID i en traad, derfor virker sleep.

hvad er det helt praecist du vil... er det en win app, er det en konsol, er det en windows service...?
Avatar billede anadan Nybegynder
11. august 2005 - 23:46 #6
Alle programmer kører i en tråd (main thread).
Hvis du kører en windows application (Windows Form) og du starter det med Application.Run(new Form()), så burde programmet ikke lukke af sig selv.
Lav en nærmere beskrivelse, eller kom med noget kode...
Avatar billede mysitesolution Nybegynder
12. august 2005 - 00:33 #7
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO;
using System.Threading;

namespace HTX_Documents
{
    /// <summary>
    /// Summary description for Main.
    /// </summary>
    public class MainClass
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            new Thread(new ThreadStart(htxSystem.Run)).Start();
        }
    }

    public class HTXSystem
    {
        private NotifyIcon trayIcon;
        private ContextMenu trayMenu;
        private enum trayError {None,Registry,Directory};

        public HTXSystem()
        {

        }

        public void Run()
        {
            if (makeTray() != trayError.None)
            {
                if (MessageBox.Show("Directory is not set. The application do only work properly, when it is set.\n\nWill you set it now?",Application.ProductName,MessageBoxButtons.YesNo) == DialogResult.Yes)
                {

                }
            }

            for (int i = 0; i < 300; i++)
            {
                Thread.Sleep(100);
            }

            ExitHTXDocuments();
        }

        private void exit(object sender, System.EventArgs e)
        {
            ExitHTXDocuments();
        }

        private void show(object sender, System.EventArgs e)
        {
           
        }

        public void ExitHTXDocuments()
        {
            trayIcon.Dispose();
            Application.Exit();
        }

        private trayError makeTray()
        {
            string dirPath = readAppReg("DirPath");
            trayError r;

            trayIcon = new NotifyIcon();
            trayIcon.Text = "HTX Documents";
            trayIcon.Icon = new Icon(GetType(), "Tray.ico");
            trayIcon.Visible = true;

            trayMenu = new ContextMenu();
            trayMenu.MenuItems.Add(0,new MenuItem("Setup", new EventHandler(show)));
            trayMenu.MenuItems.Add(1,new MenuItem("-"));
            trayMenu.MenuItems.Add(2,new MenuItem("Exit", new EventHandler(exit)));

            trayIcon.ContextMenu = trayMenu;

            if (dirPath == null)
            {
                r = trayError.Registry;
                goto exit;
            }

            if (!Directory.Exists(dirPath))
            {
                r = trayError.Directory;
                goto exit;
            }

            r = trayError.None;

            exit:
                return r;
        }

        private string readAppReg(string keyName)
        {
            RegistryKey regKey = Registry.LocalMachine;
            RegistryKey regSubKey = regKey.OpenSubKey("SOFTWARE\\"+Application.ProductName);

            if (regSubKey == null)
            {
                return null;
            }
            else
            {
                try
                {
                    return (string)regSubKey.GetValue(keyName.ToUpper());
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }
    }
}
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:01 #8
Kan du ikke lave din Main således:

[STAThread]
        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            Thread myThread = new Thread(new ThreadStart(htxSystem.Run)).Start();
            while(myThread.IsAlive)
            {
              //gør noget her eller lad være
            }
        }
Avatar billede spif2001 Nybegynder
12. august 2005 - 08:03 #9
ups - sådan her:

[STAThread]
        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            Thread myThread = new Thread(new ThreadStart(htxSystem.Run));
            myThread.Start();
            while(myThread.IsAlive)
            {
              //gør noget her eller lad være
            }
        }
Avatar billede segato Nybegynder
12. august 2005 - 08:25 #10
Du skal bruge en ManualResetEvent som står og venter på din tråd er færdig.
Avatar billede anadan Nybegynder
12. august 2005 - 09:09 #11
Jeg forstår ikke hvorfor du starter en ny tråd, og lader din main tråd afslutte. Hvorfor ikke bare lade din main tråd lave arbejdet?

        [STAThread]
        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            htxSystem.Run();
        }

Så afsluttes programmet ikke før din HTXSystem.Run() metode afslutter, hvilket vel også er meningen.
Avatar billede mysitesolution Nybegynder
12. august 2005 - 09:26 #12
anadan-> var bare en test jeg lavede, skulle ikke have været postet... hhm... prøver lige det der
Avatar billede mysitesolution Nybegynder
12. august 2005 - 09:43 #13
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO;
using System.Threading;

namespace HTX_Documents
{
    /// <summary>
    /// Summary description for Main.
    /// </summary>
    public class HTXSyst
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            Thread htxThread = new Thread(new ThreadStart(htxSystem.Run));
            htxThread.Start();
            while (htxThread.IsAlive)
            {
            }
        }
    }

    public class HTXSystem
    {
        private NotifyIcon trayIcon;
        private ContextMenu trayMenu;
        private enum trayError {None,Registry,Directory};

        public HTXSystem()
        {

        }

        public void Run()
        {
            if (makeTray() != trayError.None)
            {
                if (MessageBox.Show("Directory is not set. The application do only work properly, when it is set.\n\nWill you set it now?",Application.ProductName,MessageBoxButtons.YesNo) == DialogResult.Yes)
                {

                }
            }
        }

        private void exit(object sender, System.EventArgs e)
        {
            ExitHTXDocuments();
        }

        public void ExitHTXDocuments()
        {
            trayIcon.Dispose();
            Application.Exit();
        }

        private trayError makeTray()
        {
            string dirPath = readAppReg("DirPath");
            trayError r;

            trayIcon = new NotifyIcon();
            trayIcon.Text = "HTX Documents";
            trayIcon.Icon = new Icon(GetType(), "Tray.ico");
            trayIcon.Visible = true;

            trayMenu = new ContextMenu();
            trayMenu.MenuItems.Add(0,new MenuItem("Setup", new EventHandler(show)));
            trayMenu.MenuItems.Add(1,new MenuItem("-"));
            trayMenu.MenuItems.Add(2,new MenuItem("Exit", new EventHandler(exit)));

            trayIcon.ContextMenu = trayMenu;

            if (dirPath == null)
            {
                r = trayError.Registry;
                goto exit;
            }

            if (!Directory.Exists(dirPath))
            {
                r = trayError.Directory;
                goto exit;
            }

            r = trayError.None;

            exit:
                return r;
        }

        private string readAppReg(string keyName)
        {
            RegistryKey regKey = Registry.LocalMachine;
            RegistryKey regSubKey = regKey.OpenSubKey("SOFTWARE\\"+Application.ProductName);

            if (regSubKey == null)
            {
                return null;
            }
            else
            {
                try
                {
                    return (string)regSubKey.GetValue(keyName.ToUpper());
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }
    }
}


Virker keine... noget jeg har gjort forkert?
Avatar billede anadan Nybegynder
12. august 2005 - 09:46 #14
Drop den tråd du laver i Main, bare nøjes med

        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            htxSystem.Run();
        }
Avatar billede segato Nybegynder
12. august 2005 - 10:20 #15
Ja hvis du ikke har en grund til at bruge den tråd så giver det ikke meget mening. Nu ved jeg ikke om du sidder og træner i at lave tråde eller skal af en eller andne grund bruge en tråd ellers har anadan ret.

Skal du bruge en tråd bruger man noget der hedder AutoResetÉvent og manuelReset even og så en WaitOne funktion. WaitOne står så og venter ind til du sætter et event inde i de respektive tråde. Men jeg har en ide om du er lidt ny med c# og derfor ikke var klar over du ik behøver starte en tråd så følg anadans råd og drop den tråd du starter.
Avatar billede anadan Nybegynder
12. august 2005 - 10:44 #16
Hvis du vil holde din fremgangsmåde, så kan du bare sætte din main tråd til at sove uendeligt :

        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            Thread htxThread = new Thread(new ThreadStart(htxSystem.Run));
            htxThread.Start();
            Thread.Sleep(Timeout.Infinite));
        }
Avatar billede anadan Nybegynder
12. august 2005 - 10:46 #17
Men jeg anbefaler stadig at du bare dropper din HTXSystem tråd, da en main tråd har højere prioritet end en sekundær tråd.
Avatar billede mysitesolution Nybegynder
12. august 2005 - 12:56 #18
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO;
using System.Threading;

namespace HTX_Documents
{
    /// <summary>
    /// Summary description for Main.
    /// </summary>
    public class HTXSyst
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            htxSystem.Run();
            Thread.Sleep(Timeout.Infinite);
        }
    }

    public class HTXSystem
    {
        private NotifyIcon trayIcon;
        private ContextMenu trayMenu;
        private enum trayError {None,Registry,Directory};

        public HTXSystem()
        {

        }

        public void Run()
        {
            if (makeTray() != trayError.None)
            {
                if (MessageBox.Show("Directory is not set. The application do only work properly, when it is set.\n\nWill you set it now?",Application.ProductName,MessageBoxButtons.YesNo) == DialogResult.Yes)
                {

                }
            }
        }

        private void exit(object sender, System.EventArgs e)
        {
            ExitHTXDocuments();
        }

        private void show(object sender, System.EventArgs e)
        {
            ExitHTXDocuments();
        }

        public void ExitHTXDocuments()
        {
            trayIcon.Dispose();
            Application.Exit();
        }

        private trayError makeTray()
        {
            string dirPath = readAppReg("DirPath");
            trayError r;

            trayIcon = new NotifyIcon();
            trayIcon.Text = "HTX Documents";
            trayIcon.Icon = new Icon(GetType(), "Tray.ico");

            trayMenu = new ContextMenu();
            trayMenu.MenuItems.Add(0,new MenuItem("Setup", new EventHandler(show)));
            trayMenu.MenuItems.Add(1,new MenuItem("-"));
            trayMenu.MenuItems.Add(2,new MenuItem("Exit", new EventHandler(exit)));

            trayIcon.ContextMenu = trayMenu;

            trayIcon.Visible = true;

            if (dirPath == null)
            {
                r = trayError.Registry;
                goto exit;
            }

            if (!Directory.Exists(dirPath))
            {
                r = trayError.Directory;
                goto exit;
            }

            r = trayError.None;

            exit:
                return r;
        }

        private string readAppReg(string keyName)
        {
            RegistryKey regKey = Registry.LocalMachine;
            RegistryKey regSubKey = regKey.OpenSubKey("SOFTWARE\\"+Application.ProductName);

            if (regSubKey == null)
            {
                return null;
            }
            else
            {
                try
                {
                    return (string)regSubKey.GetValue(keyName.ToUpper());
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }
    }
}


jeg kan ikke se menuen i tray hvis jeg højreklikker... nogle som har en idé om hvorfor?
Avatar billede mysitesolution Nybegynder
12. august 2005 - 12:57 #19
raiser til 60 points
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:00 #20
og hvis jeg vælger at lave det som en tråd, så lukker menuen bare, men ikke main
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:03 #21
static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            htxSystem.Run();
            Thread.Sleep(Timeout.Infinite);
        }

den sover jo også for evigt...
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:05 #22
jep, men hvad anadan sagde jeg skulle gøre :/...
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:06 #23
hvid du laver den som tråd og laver

while (htxThread.IsAlive)
            {
            }

i stedet for

Thread.Sleep(Timeout.Infinite);

hvad så?
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:06 #24
virker det så?
Avatar billede anadan Nybegynder
12. august 2005 - 13:08 #25
Du har blandet mine forslag sammen...

Vælg enten:

Drop den tråd du laver i Main, bare nøjes med

        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            htxSystem.Run();
        }

ELLER

        static void Main()
        {
            HTXSystem htxSystem = new HTXSystem();
            Thread htxThread = new Thread(new ThreadStart(htxSystem.Run));
            htxThread.Start();
            Thread.Sleep(Timeout.Infinite));
        }
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:08 #26
du skal nok proppe en lille sleep ind i while løkken...

while (htxThread.IsAlive)
{
  Thread.Sleep(500);
}
Avatar billede anadan Nybegynder
12. august 2005 - 13:11 #27
while (htxThread.IsAlive)
            {
            }
er da en dårlig løsning, den får tråden til at lave ingenting (mange gange) hver gang det er dens tur, hvilket bruger ressourcer.

Thread.Sleep(Timeout.Infinite)) har den ønskede effekt
Avatar billede anadan Nybegynder
12. august 2005 - 13:12 #28
Jeg ville nok foretrække Thread.Suspend() fremfor Thread.Sleep(500)
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:13 #29
Nej anadan, kom bare lige til at poste en anden (prøvede nemlig også med det), men altså virker ikke med tråden også...

spif... problemet er, at min htxSystem kode løber jo også ud... prøver med noget while (htxSystem != null)?
Avatar billede anadan Nybegynder
12. august 2005 - 13:14 #30
Så hvordan ser din main metode ud nu?
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:15 #31
--> anadan : det var for ikke at tonse rundt i while løkken - hvis du suspender den skal nogen jo resume den før den kommer ud af løkken...
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:16 #32
har prøvet dit spif, virker ikke... pga. htxThread dør ud hhm...

kan ikke finde nogen Suspend()?
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:17 #33
HTXSystem htxSystem = new HTXSystem();
            Thread htxThread = new Thread(new ThreadStart(htxSystem.Run));
            htxThread.Start();
            while (htxThread.IsAlive)
            {
                Thread.Sleep(500);
            }

og den dør ud
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:17 #34
hvorfor laver du den ikke bare som en windowsapplication?
Avatar billede anadan Nybegynder
12. august 2005 - 13:17 #35
Pointen er vel at main metoden bare skal lave ingenting, indtil  htxThread.Run er færdig, hvorefter metoden Application.Exit() kaldes, og afslutter alle kørende tråde. Derfor kan den sagtens suspendes. Men jeg vil nu stadig foretrække Thread.Sleep(Timeout.Infinite));
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:19 #36
du kan jo bare sætte formens invisible til false hvis du ikke vil se den.
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:20 #37
eller bruge opacity variablen på formen og sætte den til 0%
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:21 #38
Bruger det ikke en masse crappy resurcer så?...

Hvis en af jer laver det, så crappet virker, 100 points...
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:22 #39
var faktisk også en windows app i starten... men så gad den ikke at Hide efter formen blev oprettet, så prøvede jeg dette... uden held indtil videre
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:41 #40
Hvis jeg var dig, ville jeg lave det som en windowsapp. igen og proppe koden i din run metode ind i main formens constructor:

if (makeTray() != trayError.None)
            {
                if (MessageBox.Show("Directory is not set. The application do only work properly, when it is set.\n\nWill you set it now?",Application.ProductName,MessageBoxButtons.YesNo) == DialogResult.Yes)
                {

                }
            }

i design editoren kan du sætte opacity til 0% - så dukker den ikke op før du selv ændrer opacity igen.
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:45 #41
Opacity vil jeg ikke bruge... så er den jo stadig og bruger recurser... Bruger Hide mindre resurcer?
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:51 #42
Nu "virker" det, men formen hider ikke... med opacity bliver den stadig i windows menuen tingen...

så vil bruge hide... Men hvor og hvordan :/
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:53 #43
windows menuen tingen?

er det showintaskbar propertyen du mangler at sætte til false?
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:54 #44
Avatar billede mysitesolution Nybegynder
12. august 2005 - 13:55 #45
ja, men er opacity og taskbar =false det samme recursemæssigt som Hide()? mener jeg nemlig ikke, og vil ikke bruge mere end jeg skal...

har en hide der i pastebin... den virker ikke... har også en i knappen, den virker, men man skal self. ikke trykke på den hver gang
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:56 #46
dødt link
Avatar billede spif2001 Nybegynder
12. august 2005 - 13:58 #47
hvad med at sætte opacity til 0 og så Hide formen når den er færdig med at initialisere sig
Avatar billede anadan Nybegynder
12. august 2005 - 14:00 #48
hvad med bare at minimere formen, og så ikke vise den i taskbar
Avatar billede spif2001 Nybegynder
12. august 2005 - 14:02 #49
kan han nå det eller vil formen lige hurtigt blive vist?
Avatar billede mysitesolution Nybegynder
12. august 2005 - 14:03 #50
jeg vil have en hide... hhm...

http://www.pastebin.com/335219

virker her?

hider efter ini. og det virker ikke
Avatar billede spif2001 Nybegynder
12. august 2005 - 14:04 #51
vores server er lige røget - så jeg kan kun se cached sider - linket virker sikkert :)
Avatar billede mysitesolution Nybegynder
12. august 2005 - 14:06 #52
efter min hide bliver den visible igen...

har lige prøvet at putte hide i event visiblechanged, og det virker, men der når jeg at se det i et split sekund... ved bare ikke hvor den bliver visible igen ?
Avatar billede anadan Nybegynder
12. august 2005 - 14:06 #53
bare minimer den før den bliver vist...
Avatar billede mysitesolution Nybegynder
12. august 2005 - 14:14 #54
hhm... virker... er dog ikke helt så glad for løsningen men lad nu det ligge...

Splitter pointsne... opret svar spif
Avatar billede spif2001 Nybegynder
12. august 2005 - 14:15 #55
svar :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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