Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как правильно работать с потоками?

45K
30 апреля 2010 года
arturline
2 / / 22.12.2008
Есть richTextBox, в который записываются все действия, совершаемые программой. В процессе запускается wget.exe через Process.Start() и в зависимости от возвращаемого ExitCode, должен выполняться определенный метод, а итог его работы записыватся в richTextBox. Все работает, но когда запущен wget.exe, форма висит. Когда запускаю wget.exe в отдельном потоке, тогда моя программа не дожидается завершения работы wget.exe и запускает не тот метод и пишет в richTextBox не то, что надо.
Как быть, подскажите, пожалуйста.
307
30 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: arturline
Есть richTextBox, в который записываются все действия, совершаемые программой. В процессе запускается wget.exe через Process.Start() и в зависимости от возвращаемого ExitCode, должен выполняться определенный метод, а итог его работы записыватся в richTextBox. Все работает, но когда запущен wget.exe, форма висит. Когда запускаю wget.exe в отдельном потоке, тогда моя программа не дожидается завершения работы wget.exe и запускает не тот метод и пишет в richTextBox не то, что надо.
Как быть, подскажите, пожалуйста.



будьте так любезны предъявить на всеобщее обозрение код.

45K
30 апреля 2010 года
arturline
2 / / 22.12.2008
Цитата: Artem_3A
будьте так любезны предъявить на всеобщее обозрение код.


вот, пожалуйтса:

Код:
public partial class Form1 : Form
    {
        Thread thread;
        string CurrentCommand;
        string HostUserLogin = "ejbqoall";
        string HostUserPassw = "JdCrnAih";
        string HostSite = "http://www.urspectr.info";
        public int Result = -1;

        public Form1()
        {
            InitializeComponent();
        }

        public void RunExe()
        {
           
                Process CMDProcess = new Process();
                CMDProcess.StartInfo.FileName = "wget.exe";
                // параметры
                CMDProcess.StartInfo.Arguments = CurrentCommand;

                CMDProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
                // запуск
                CMDProcess.Start();
                // ждем завершения
                CMDProcess.WaitForExit();
                Result = CMDProcess.ExitCode;
                CMDProcess.Close();
           
        }

        public void Delay(long DelayTime)
        {
            long TheTime;
            TheTime = Environment.TickCount + DelayTime;
            while (Environment.TickCount < TheTime)
            {
                Application.DoEvents();
            }
        }

        #region метод LoadFileSpisFromWeb
        public void LoadFileSpisFromWeb(string TSystem)
        {

            string Options;
            //int Result;
            Options = "wget.exe ";
            Options = Options + "--http-user=" + HostUserLogin + " --http-passwd=" + HostUserPassw + " ";
            Options = Options + "--directory-prefix=" + TSystem + " --tries=20 --continue=on --cach=off --server-response=on --dot-style=mega ";
           
            CurrentCommand = Options + HostSite + "/update.php?type=" + TSystem;
            textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss"));
            textBox1.AppendText(" Начало загрузки списка файлов для ИБ " + TSystem + ".\n\n");
            Delay(500);

            // запускаем WGET на загрузку списка файлов с сайта
            thread = new Thread(RunExe);
            thread.IsBackground = true;
            thread.Start();

            // как дождаться результата WGET и в зависимости от его значения выполнить нужный case?
            bool ask = true;
            if (thread.IsAlive)
            {
                ask = true;
            }
            else if (thread.IsAlive == false) ask = false;
            if (ask == false)
            {
                switch (Result)
                {
                    case 0:
                        textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss"));
                        textBox1.AppendText(" Загрузка списка файлов для ИБ" + " успешно завершена.\n\n");
                        Delay(500);
                        break;
                    case 2:
                        textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss"));
                        textBox1.AppendText(" Менеджер закачак wget.exe не найден. \n\n");

                        Delay(500);
                        break;
                    default:
                        textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss"));
                        textBox1.AppendText(" Загрузка списка файлов для ИБ" + " закончилась ошибкой.\nКод ошибки: " + Convert.ToString(Result) + "\n\n");
                        Delay(500);
                        break;
                }            
            }
        }
        #endregion

        private void button3_Click(object sender, EventArgs e)
        {
            Script();  
        }
        private void Script()
        {  
            // к примеру, результат предыдущих методов...
            textBox1.AppendText("Метод 1 выполнен успешно.\n");
            Delay(500);
            textBox1.AppendText("Метод 2 выполнен успешно.\n");
            Delay(500);
            textBox1.AppendText("Метод 3 выполнен успешно.\n");
            Delay(500);
            textBox1.AppendText("Метод 4 выполнен с двумя ошибками.\n");
            Delay(500);
            textBox1.AppendText("Метод 5 выполнен успешно.\n");
            Delay(500);
            textBox1.AppendText("Метод 6 выполнен успешно.\n");
            Delay(500);
            // далее запускаем этот метод...
            LoadFileSpisFromWeb("RLAW905");
        }
    }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог