Родительское окно зависает при выполнении дочернего процесса внутри родительского окна. - PullRequest
0 голосов
/ 09 января 2012

Вот сценарий ... Приложение на VC ++ под Windows (я использую Visual Studio 2008). У меня есть родительское окно с несколькими вкладками и некоторыми элементами управления. В одной из вкладок я динамически загружал приложение при выборе его в строке меню. Когда дочернее приложение исполняется, родительское окно перестает отвечать, и единственный способ закрыть приложение - использовать ctrl + alt + del.
Но ...
Эта проблема возникла только тогда, когда я добавил какой-то другой код в событие click определенного элемента меню, которое инициировало дочерний процесс.
Вот две версии кода:

namespace MyApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Process proc = new Process();
            proc.StartInfo.Arguments = "some arguments";
            proc.StartInfo.FileName = "ApplicationName.exe";
            proc.Start();
            proc.WaitForInputIdle();
            SetParent(proc.MainWindowHandle, panel1.Handle);            
        }

        [DllImport("user32.dll")]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);        
    }
}

Приведенный выше код работает нормально.

Вот код проблемы:

namespace MyApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(SomeSettings == 1)
            {
              Process proc = new Process();
              proc.StartInfo.Arguments = "some arguments";
              proc.StartInfo.FileName = "ApplicationName.exe";
              proc.Start();
              proc.WaitForInputIdle();
              SetParent(proc.MainWindowHandle, panel1.Handle);
              textBox1.Text = System.IO.File.ReadAllText("LogFile.log"); //some log file created by the process
            }
            else
            {
              //few if-else statements
              //few switch-case statements
              Process proc = new Process();
              proc.StartInfo.Arguments = "some arguments";
              proc.StartInfo.FileName = "ApplicationName.exe";
              proc.Start();
              proc.WaitForInputIdle();
              SetParent(proc.MainWindowHandle, panel1.Handle);
              textBox1.Text = System.IO.File.ReadAllText("LogFile.log"); //some log file created by the process
            }
        }

        [DllImport("user32.dll")]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);        
    }
}

При выполнении второго кода родительский процесс запускает дочерний процесс, но окно приложения останавливается.
Может кто-нибудь сказать мне, почему это происходит ... ??? Это из-за чрезмерного случая if-else и switch или из-за загрузки файла журнала ... ??? И как это исправить ... ???

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...