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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы