Как усыплять дочерний поток реализуя управление элементами из главного потока методом 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; // выходим из потока })); } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д