11. august 2005 - 16:37Der 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...
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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...
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); }
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; }
[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 } }
[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 } }
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) {
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; }
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.
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) {
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; }
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
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));
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.
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 ?
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.