none
Создание нового процесса на C# RRS feed

  • Вопрос

  • В Visual Studio на языке C# пытаюсь создать проект, в котором имеется три формы. Необходимая логика работы создаваемой программы следующая:

    1. после запуска программы открывается Form1;
    2. затем, на этой форме выбирается задача 1 или 2=>нажимается Ok;
    3. процесс с Form1 завершается и в зависимости от выбранного запускается новый процесс с Form2 или Form3.
    Никак не могу понять, как реализовать пункт 3). Конечно можно скрыть Form1, открыть Form2\Form3, но это во-первых некрасиво(код не особо впечатляющий получается), а во-вторых оперативная память занятая под процесс с Form1 расходуется зря. Если открыть Form2\Form3, а затем закрыть Form1, то весь процесс прервется и вся программа закроется, а это не хорошо. Поэтому хотелось бы узнать: существуют ли в языке C# средства для создания процесса независимого от текущего(в VS2010 стандартная функция WinAPI CreateProcess недоступна) и как это можно организовать?
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:20 MSDN Forums consolidation (От:Visual C#)
    14 сентября 2010 г. 5:55

Ответы

  • В файле проекта Program.cs, в котором находится точка входа в программу, инициализацию формы вынеси из метода Application.Run(), так чтобы получилось как показано тут. Тогда процесс не будет привязан к потоку формы:

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
     static class Program
     {
     /// <summary>
     /// Главная точка входа для приложения.
     /// </summary>
     [STAThread]
     static void Main()
     {
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
    
     Form1 f1 = new Form1();
     f1.Show();
    
     Application.Run();
     }
     }
    }
    
    

     

    А в других формах, при закрытии которых надо, чтобы приложение завершало свою работу, добавь код в обработчике события, которое происходит после закрытия формы:

     

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
     {
     Application.Exit();
     }
    

    Теперь при инициализации второй формы, первую можно смело закрывать и отображать вторую форму. Приложение не завершит свою работу. А при закрытии второй формы можно уже закончить работу приложения.

    Смысла убивать процесс я не вижу, у тебя останется работать в нем только новая открытая форма.

     


    E-mail: Svatoslav.Pankratov@gmail.com
    • Помечено в качестве ответа Maximys33 14 сентября 2010 г. 22:06
    14 сентября 2010 г. 7:10

Все ответы

  • В файле проекта Program.cs, в котором находится точка входа в программу, инициализацию формы вынеси из метода Application.Run(), так чтобы получилось как показано тут. Тогда процесс не будет привязан к потоку формы:

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
     static class Program
     {
     /// <summary>
     /// Главная точка входа для приложения.
     /// </summary>
     [STAThread]
     static void Main()
     {
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
    
     Form1 f1 = new Form1();
     f1.Show();
    
     Application.Run();
     }
     }
    }
    
    

     

    А в других формах, при закрытии которых надо, чтобы приложение завершало свою работу, добавь код в обработчике события, которое происходит после закрытия формы:

     

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
     {
     Application.Exit();
     }
    

    Теперь при инициализации второй формы, первую можно смело закрывать и отображать вторую форму. Приложение не завершит свою работу. А при закрытии второй формы можно уже закончить работу приложения.

    Смысла убивать процесс я не вижу, у тебя останется работать в нем только новая открытая форма.

     


    E-mail: Svatoslav.Pankratov@gmail.com
    • Помечено в качестве ответа Maximys33 14 сентября 2010 г. 22:06
    14 сентября 2010 г. 7:10
  • Поэтому хотелось бы узнать: существуют ли в языке C# средства для создания процесса независимого от текущего(в VS2010 стандартная функция WinAPI CreateProcess недоступна) и как это можно организовать?


    1. Process.Start()

    http://msdn.microsoft.com/ru-ru/library/h6ak8zt5.aspx

    2. Почему CreateProcess недоступна вам? PInvoke и вперед

    http://pinvoke.net/default.aspx/kernel32/CreateProcess.html 

    14 сентября 2010 г. 10:03
  • Похоже под процессом тут подразумевается совсем не Process. Не знаю как там мог получиться невпечатляющий код. Спрятать Form1, показать Form2/3, потом вернуть From1 - это пара строк.

     

    private void button1_Click(object sender, EventArgs e)
    {
     this.Hide();
     using (Form2 form2 = new Form2())
     {
      form2.ShowDialog();
     }
     this.Show();
    }
    

     

    Про память, расходуемую на процесс с Form1 (точнее, на сам From1) - на форму с двумя радиобаттонами и кнопкой уходит 14 килобайт памяти. Несерьезная экономия :)

     

    14 сентября 2010 г. 11:08
  • Похоже под процессом тут подразумевается совсем не Process. Не знаю как там мог получиться невпечатляющий код. Спрятать Form1, показать Form2/3, потом вернуть From1 - это пара строк.


    дык это понятно было, мне просто весело от формулировок
    14 сентября 2010 г. 11:30