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");
}
}
Как правильно работать с потоками?
Как быть, подскажите, пожалуйста.
Цитата: arturline
Есть richTextBox, в который записываются все действия, совершаемые программой. В процессе запускается wget.exe через Process.Start() и в зависимости от возвращаемого ExitCode, должен выполняться определенный метод, а итог его работы записыватся в richTextBox. Все работает, но когда запущен wget.exe, форма висит. Когда запускаю wget.exe в отдельном потоке, тогда моя программа не дожидается завершения работы wget.exe и запускает не тот метод и пишет в richTextBox не то, что надо.
Как быть, подскажите, пожалуйста.
Как быть, подскажите, пожалуйста.
будьте так любезны предъявить на всеобщее обозрение код.