Changeset 2153


Ignore:
Timestamp:
Dec 2, 2010, 10:06:19 PM (11 years ago)
Author:
sauer
Message:

CrypUpdater: Improved handling with other, remaining CrypStartup processes preventing the update

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypUpdater/App.xaml.cs

    r2055 r2153  
    3030        private Process p;
    3131
     32        private List<Process> unwantedProcesses = new List<Process>();
     33
    3234
    3335        private void Application_Startup(object sender, StartupEventArgs e)
     
    3739            m.Show();
    3840            int CryptoolProcessID;
     41           
    3942
    4043            try
     
    4851                if (p.WaitForExit(1000 * 30))
    4952                {
    50                     UnpackZip(ZipFilePath, CryptoolFolderPath);
     53                    unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
     54                    if (unwantedProcesses.Count == 0)
     55                        UnpackZip(ZipFilePath, CryptoolFolderPath);
     56                    else
     57                    {
     58                        AskForLicenseToKill();
     59                    }
     60
    5161                }
    5262                else
     
    6272                            p.Kill();
    6373                            p.WaitForExit();
    64                             UnpackZip(ZipFilePath, CryptoolFolderPath);
     74                            unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
     75                            if (unwantedProcesses.Count == 0)
     76                                UnpackZip(ZipFilePath, CryptoolFolderPath);
     77                            else
     78                            {
     79                                AskForLicenseToKill();
     80                            }
    6581                        }
    6682                        catch (Exception)
    6783                        {
    68                             UnpackZip(ZipFilePath, CryptoolFolderPath);
     84                            unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
     85                            if (unwantedProcesses.Count == 0)
     86                                UnpackZip(ZipFilePath, CryptoolFolderPath);
     87                            else
     88                            {
     89                                AskForLicenseToKill();
     90                            }
    6991                        }
    7092                    }
    7193                    else
    7294                    {
    73                         MessageBox.Show("Update failed. Cryptool 2.0 will be restarted.");
     95                        MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.");
    7496                        RestartCryptool();
    7597                    }
     
    83105                if (CryptoolExePath != null)
    84106                {
    85                     MessageBox.Show("Update failed. Cryptool 2.0 will be restarted.", "Error");
     107                    MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.", "Error");
    86108                    RestartCryptool();
    87109                }
     
    97119            catch (ArgumentException) // the invoking process has already exited (no such process with this id exists)
    98120            {
     121                unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
     122                if (unwantedProcesses.Count == 0)
     123                    UnpackZip(ZipFilePath, CryptoolFolderPath);
     124                else
     125                {
     126                    AskForLicenseToKill();
     127                }
     128            }
     129
     130        }
     131
     132        private void AskForLicenseToKill()
     133        {
     134            MessageBoxButton mbb = MessageBoxButton.YesNo;
     135            string caption = "Error";
     136            string messagePart1;
     137            string messagePart2;
     138            string messagePart3;
     139            if (unwantedProcesses.Count > 1)
     140            {
     141                messagePart1 = "Several instances";
     142                messagePart2 = "are";
     143                messagePart3 = "these processes";
     144            }
     145            else
     146            {
     147                messagePart1 = "Another instance";
     148                messagePart2 = "is";
     149                messagePart3 = "this process";
     150            }
     151            MessageBoxResult result;
     152            result = MessageBox.Show(messagePart1 + " of CrypTool 2.0 using the same resources " + messagePart2 + " still running. Kill " + messagePart3 + " to proceed?", caption, mbb);
     153            if (result == MessageBoxResult.Yes)
     154            {
     155                KillOtherProcesses(unwantedProcesses);
    99156                UnpackZip(ZipFilePath, CryptoolFolderPath);
    100157            }
    101 
     158            else
     159            {
     160                MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.");
     161                RestartCryptool();
     162            }
     163        }
     164
     165        private static void KillOtherProcesses(List<Process> unwantedProcesses)
     166        {
     167            try
     168            {
     169                foreach (Process pr in unwantedProcesses)
     170                {
     171                    if (!pr.HasExited)
     172                    {
     173                        pr.Kill();
     174                        pr.WaitForExit();
     175                    }
     176                }
     177            }
     178            catch (Exception)
     179            {
     180                MessageBox.Show("Update failed. Not able to remove remaining CrypTool 2.0 instances.", "Error");
     181                RestartCryptool();
     182            }
    102183        }
    103184
     
    144225                        i++;
    145226                        progress = i * 100 / count;
    146                         UpdateProgress(progress);
     227                        m.UpdateProgress(progress);
    147228                    }
    148229
     
    153234            catch (Exception)
    154235            {
    155                 MessageBox.Show("Update failed. Cryptool 2.0 will be restarted.", "Error");
     236                MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.", "Error");
    156237                RestartCryptool();
    157238            }
     
    159240        }
    160241
    161         private void UpdateProgress(double progress)
    162         {
    163             Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    164             {
    165                 m.progressBar1.Value = progress;
    166             }, null);
     242
     243        private List<Process> FindCrypToolProcesses(string cryptoolExePath)
     244        {
     245            List<Process> processList = new List<Process>();
     246
     247            foreach (Process p in Process.GetProcesses())
     248            {
     249                if (p.ProcessName == "CrypStartup" && p.MainModule.FileName == cryptoolExePath)
     250                    processList.Add(p);
     251            }
     252
     253            return processList;
    167254        }
    168255
  • trunk/CrypUpdater/MainWindow.xaml.cs

    r2056 r2153  
    1212using System.Windows.Navigation;
    1313using System.Windows.Shapes;
     14using System.Windows.Threading;
     15using System.Threading;
    1416
    1517namespace CrypUpdater
     
    2628        }
    2729
     30        internal void UpdateProgress(double progress)
     31        {
     32            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     33            {
     34                progressBar1.Value = progress;
     35            }, null);
     36        }
     37
    2838        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    2939        {
Note: See TracChangeset for help on using the changeset viewer.