Автор: BlackVetal
Дата сообщения: 19.09.2013 14:02
NatNiM
У тебя получается что ты обращаешься из потока (ну насколько я понял тебя функция создает поток и потом выполняет этот код в потоке) к компоненту из другого потока.
примерно так (это примитивная контрольная кому-то была)
[more]
public partial class Form_ControlWindow : Form
{
#region Поля
/// <summary>
/// Максимальное значение для генерации случайного останова процесса имитации конвеера
/// </summary>
private int maxValueSleep = 10000;
/// <summary>
/// Максимальное значение для генерации аварийного останова
/// </summary>
private int maxValueАвария = 100000;
/// <summary>
/// Предел - когда считается что ситуация аварийная и нужен останов
/// </summary>
private int PredelАвария = 95000;
/// <summary>
/// Статус конвеера №1
/// </summary>
private Conveer_Status Status1;
/// <summary>
/// Статус конвеера №2
/// </summary>
private Conveer_Status Status2;
/// <summary>
/// Статус конвеера №3
/// </summary>
private Conveer_Status Status3;
/// <summary>
/// Статус конвеера №4
/// </summary>
private Conveer_Status Status4;
#endregion
#region Конструктор
/// <summary>
/// Конструктор данного класса
/// </summary>
public Form_ControlWindow()
{
InitializeComponent();
}
#endregion
#region Методы
/// <summary>
/// Делегат - необходим для создания асинхронных и синхронных потоков
/// имитации работы конвеера
/// </summary>
/// <param name="_status"> Статус конвеера</param>
/// <param name="_TextBox">Контрол - куда нужно выводить статус</param>
delegate void StartConveerDelegate(Conveer_Status Status, RichTextBox _TextBox, XtraUserControl _userControl);
/// <summary>
/// Метод Запускает конвеер с переданными параметрами.
/// В переменной _status - передается ссылка на переменную содержащую статус конвеера
/// а в переменной _TextBox - передается контрол - в котором должна выводиться информация
/// о состоянии конвеера и смене стадий обработки
/// </summary>
/// <param name="_status"> Статус конвеера</param>
/// <param name="_TextBox">Контрол - куда нужно выводить статус</param>
private void StartConveer(Conveer_Status Status, RichTextBox _TextBox, XtraUserControl _userControl)
{
// создаем объект генератора случайных чисел
Random rnd = new Random();
// цикл имитации конвеера - бесконечный
while (true)
{
// получаем текущий статус конвеера
int Step = (int)Status;
//если статус - последний цикл обработки асбеста, то переходим к первому шагу
if (Step == (int)Conveer_Status.Упаковка_Хризотила)
Step = (int)Conveer_Status.Загрузка_Руды;
else // иначе просто переходим к следующему шагу
Step++;
// присваиваем новый статус конвеера
Status = (Conveer_Status)Step;
// вычисляем аварийную ситуацию
// для этого генерируем число - которое означает вероятность аварии
// затем сравниваем с пределом - который означает допустимое значение
// аварийности
int авария = rnd.Next(maxValueАвария);
if (авария > PredelАвария)
{
// выводим статус что произошла авария
ShowStatus(Conveer_Status.Останов_Авария, _TextBox, _userControl);
// приостанавливаем поток
Thread.Sleep(rnd.Next(maxValueSleep*3));
}
// выводим статус что произошла авария
ShowStatus(Status, _TextBox, _userControl);
// приостанавливаем поток
Thread.Sleep(rnd.Next(maxValueSleep));
}
}
/// <summary>
/// Делегат - необходим для создания синхронных и асинхронных потоков вывода
/// статуса конвеера.
/// ПО сути дела - это объявление шаблона.
/// </summary>
/// <param name="_status"> Статус конвеера который нужно вывести</param>
/// <param name="_TextBox">Контрол - куда нужно вывести статус</param>
delegate void ShowStatusDelegate(Conveer_Status _status, RichTextBox _TextBox, XtraUserControl _userControl);
/// <summary>
/// Метод выводит текущий статус конвеера в соответствующее ему окошко.
/// Весь вывод осуществляется асинхронно - если все идет стандартно. Это
/// необходимо для того чтобы не тормозить остальные процессы.
/// </summary>
/// <param name="_status"> Статус конвеера который нужно вывести</param>
/// <param name="_TextBox">Контрол - куда нужно вывести статус</param>
private void ShowStatus(Conveer_Status _status, RichTextBox _TextBox, XtraUserControl _userControl)
{
// проверяем - соответствует ли даный контрол текущему потоку
if (_TextBox.InvokeRequired == false)
{
// выводим строку статуса
_TextBox.Text += "" + DateTime.Now.ToString() + " -> " + _status + Environment.NewLine;
_userControl.SetStep(_status);
}
else // создаем вывод статуса в синхронном потоке
{
ShowStatusDelegate _showStatus = new ShowStatusDelegate(ShowStatus);
this.BeginInvoke(_showStatus, new object[] { _status, _TextBox, _userControl });
}
}
#endregion
#region События
/// <summary>
/// Метод Запускает конвеер №1. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer1</param>
/// <param name="e">Аргументы события</param>
private void button_StartConveer1_Click(object sender, EventArgs e)
{
Status1 = Conveer_Status.Останов;
textBox_conveer1.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status1, textBox_conveer1, xtraUserControl1, null, null);
}
/// <summary>
/// Метод Запускает конвеер №2. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer2</param>
/// <param name="e">Аргументы события</param>
private void button__StartConveer2_Click(object sender, EventArgs e)
{
Status2 = Conveer_Status.Останов;
richTextBox_Conveer2.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status2, richTextBox_Conveer2, xtraUserControl2, null, null);
}
/// <summary>
/// Метод Запускает конвеер №3. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer3</param>
/// <param name="e">Аргументы события</param>
private void button__StartConveer3_Click(object sender, EventArgs e)
{
Status3 = Conveer_Status.Останов;
richTextBox_Conveer3.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status3, richTextBox_Conveer3, xtraUserControl3, null, null);
}
/// <summary>
/// Метод Запускает конвеер №4. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer4</param>
/// <param name="e">Аргументы события</param>
private void button_StartConveer4_Click(object sender, EventArgs e)
{
Status4 = Conveer_Status.Останов;
richTextBox_Conveer4.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status4, richTextBox_Conveer4, xtraUserControl4, null, null);
}
#endregion
}
/// <summary>
/// Статусы конвеера - стадии обработки и возможные остановы.
/// </summary>
public enum Conveer_Status
{
Останов = 0,
Загрузка_Руды = 1,
Дробление_Руды = 2,
Отсев_Волокна = 3,
Распущевание_Волокна = 4,
Прессовка_Волокна = 5,
Упаковка_Хризотила = 6,
Останов_Авария = 10
}
[/more]