Как усыплять дочерний поток реализуя управление элементами из главного потока методом Invoke - C#
Формулировка задачи:
как управлять элементами из главного потока в дочернем? Если напишите методом Invoke, то объясните тогда - как заставять в определённых ситуациях усыплять дочерний поток?
Немного дополню: например если в методе, который перенаправляется в главный поток и там реализуются некие условия, после чего, если условие правильно, то дочерник поток поток должен засыпать. Как это реализовать?
Решение задачи: «Как усыплять дочерний поток реализуя управление элементами из главного потока методом Invoke»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace ButtonTextInvokeAndThreat
{
public partial class frmMain : Form
{
// поток изменяющий текст на кнопке
private Thread t = null;
// сохраняет условие
private string uslovie;
// турникет для "условие изменилось"
private EventWaitHandle uslovieIzmenilos = new EventWaitHandle(false, EventResetMode.AutoReset);
public frmMain()
{
InitializeComponent();
}
// кнопка, при нажатии на которую применяется определенное условие
private void btnSetIf_Click(object sender, EventArgs e)
{
// установим условие
uslovie = txtBox.Text;
uslovieIzmenilos.Set();
}
// запускаем поток при старте формы
private void frmMain_Load(object sender, EventArgs e)
{
t = new Thread(ChangeTextOnButton);
t.Name = "ThreadForSleep";
t.Start();
}
private bool NeedToSleep = false;
private object locker = new object(); // объект для блокировки переменной NeedToSleep
public void ChangeTextOnButton() {
bool exit = false;
while (!exit) {
lock (locker) { // устанавливаем блокировку NeedToSleep
if (NeedToSleep == true) { // если NeedToSleep == true, то поток спит
Thread.Sleep(300);
}
NeedToSleep = false; // после того как поспали, спать больше не надо
}
uslovieIzmenilos.WaitOne();
if (btnButton.InvokeRequired) {
btnButton.Invoke(new ThreadStart(delegate {
if (uslovie == "") // если условие пустое
{
btnButton.Text = "Пустое условие"; // то изменяем текст на кнопке
if (btnButton.Text != "Текст на кнопке") { // если текст на кнопке не равен "Текст на кнопке"
lock (locker) {
NeedToSleep = true; // то поспим чуть-чуть
}
}
}
if (uslovie == "1") btnButton.Text = "Вы ввели единичку";
if (uslovie == "2") btnButton.Text = "Вы ввели цифру два";
if (uslovie == "exit") exit = true; // выходим из потока
}));
}
}
}
}
}