Большой Воронежский Форум
» Программирование>C# - Вопросы по многопоточности в программе.
Мамед 22:51 05.05.2009
Здравствуйте! Хочу написать программу, которая будет запускать приложения с ожиданием завершения. Возникло 2 вопроса:
1) Как избавиться от ошибки, (которая появляется только при запуске из Visual Studio в режиме отладки, а при обычном запуске приложения она не наблюдается) суть которой в том, что я обращаюсь к прогрессбару1 не из того потока, в котором он был создан?
2) Несмотря на то, что загнал установку приложений в отдельный поток, наблюдаю "тормоза" (тормоз заключается в оставлении следа от окна установки на моей проге при попытке перемещения окна установки) в программе при перемещении окна установки программы. Такое ощущение, что никакого потока не создавал или того, что создал все равно мало. Подскажите, как избавиться от такого поведения?

Привожу полный код с указанием места ошибки:

Сообщение от :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;
using Microsoft.DirectX.AudioVideoPlayback;
namespace SoftInstall
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(Application.StartupPath);
DirectoryInfo[] massiv = di.GetDirectories();
foreach (DirectoryInfo soft in massiv)
listBox1.Items.Add(soft.Name);
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
button1.Enabled = true;
else
button1.Enabled = false;
}
public void Installing()
{
for (int i = 0; i < listBox1.Items.Count; i++)
{
Process proc = new Process();
proc.StartInfo.FileName = Application.StartupPath + "\\" + listBox1.Items[i] + "\\Script.exe";
proc.StartInfo.UseShellExecute = true;
proc.Start();
proc.WaitForExit();
proc.Close();
progressBar1.PerformStep();//ТУТ ВОЗНИКАЕТ ОШИБКА
}
}
public void button1_Click(object sender, EventArgs e)
{
progressBar1.Value = 0;
выходToolStripMenuItem.Enabled = false;
Audio mus = new Audio(Application.StartupPath + "\\Snd.m3");
mus.Play();
progressBar1.Maximum = listBox1.Items.Count;
progressBar1.Step = 1;
Thread t = new Thread(new ThreadStart(Installing));
t.Start();
t.Join();
MessageBox.Show("Установка всех приложений завершена!\nЕсли необходимо - сделайте перезагрузку.", "Завершено", MessageBoxButtons.OK, MessageBoxIcon.Information);
mus.Stop();
выходToolStripMenuItem.Enabled = true;
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}

Вверх