vinodh muthusamy Ответов: 1

C# - пауза потока во время работы приложения


Я создал 1 приложение для чтения из Excel и отображения этого содержимого в каждом текстовом поле, я использовал концепцию потоковой передачи для ожидания(сна от заданного ввода) для каждой строки для чтения и отображения в текстовом поле.

Вопрос: я хочу приостановить поток во время запуска приложения(во время выполнения), когда мы нажимаем другую кнопку, я пытался со своей стороны, но фокус не приходит к нам.

// To Display in Text box.
private void DisplayText()
        {
        BoomStubAngle:
            int BoomStubAngle = 0;
            for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
            {
                string BSAname = ds.Tables[0].Rows[i][BSA].ToString();
                txt_BSA.Text = BSAname.ToString();
                txt_BSA.Focus();
            }
        BoomForeAngle:
            int BoomForeAngle = 1;
            for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
            {
                string BFAname = ds.Tables[0].Rows[i][BFA].ToString();
                txt_BFA.Text = BFAname.ToString();
                txt_BFA.Focus();
            }
        BoomForeHeadEndPressure:
            int BoomForeHeadEndPressure = 2;
            for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
            {
               string BFname = ds.Tables[0].Rows[i][BFHEP].ToString();
                txt_BFHEP1.Text = BFname.ToString();
                txt_BFHEP1.Focus();
                j++;
              // Thread sleep Time-From User Input
                Thread.Sleep(Convert.ToInt32(Stimer));
            goto BoomStubAngle;
            }
        connclose:
            connExcel.Close();
        }
//??Iam not getting focus to this button in run time when thread is running.??
 private void button2_Click(object sender, EventArgs e)
        {
           
            startstop = false;

            //do
            //{
            //    Thread.Sleep(1000);
            //}
            //while (startstop == true);
            //DisplayText();

        }


Что я уже пробовал:

// To Display in Text box.
private void DisplayText()
        {
        BoomStubAngle:
            int BoomStubAngle = 0;
            for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
            {
                string BSAname = ds.Tables[0].Rows[i][BSA].ToString();
                txt_BSA.Text = BSAname.ToString();
                txt_BSA.Focus();
            }
        BoomForeAngle:
            int BoomForeAngle = 1;
            for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
            {
                string BFAname = ds.Tables[0].Rows[i][BFA].ToString();
                txt_BFA.Text = BFAname.ToString();
                txt_BFA.Focus();
            }
        BoomForeHeadEndPressure:
            int BoomForeHeadEndPressure = 2;
            for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
            {
               string BFname = ds.Tables[0].Rows[i][BFHEP].ToString();
                txt_BFHEP1.Text = BFname.ToString();
                txt_BFHEP1.Focus();
                j++;
              // Thread sleep Time-From User Input
                Thread.Sleep(Convert.ToInt32(Stimer));
            goto BoomStubAngle;
            }
        connclose:
            connExcel.Close();
        }
//??Iam not getting focus to this button in run time when thread is running.??
 private void button2_Click(object sender, EventArgs e)
        {
           
            startstop = false;

            //do
            //{
            //    Thread.Sleep(1000);
            //}
            //while (startstop == true);
            //DisplayText();

        }

Mehdi Gholam

Чтение excel, отображение и потоки не имеют смысла.

vinodh muthusamy

Оставив чтение концепции Excel, я спросил, как приостановить поток, когда приложение находится во время выполнения.

Mehdi Gholam

Вы используете нить.Сон().

vinodh muthusamy

Я не могу получить фокус кнопки во время выполнения

Kenneth Haugland

Вы должны немедленно прекратить использовать GoTo, они создают трудный для чтения и трудно поддерживаемый код. Просто прекрати.

OriginalGriff

В данном случае он использует нить.Сон на потоке пользовательского интерфейса в бесконечном цикле.: вздох:

vinodh muthusamy

Если я прекращу использование goto немедленно, я буду вам сосредоточиться на форме и приостановить поток

vinodh muthusamy

Даже я удалил Гото немедленно. Но все же я не могу сосредоточиться на форме во время выполнения.

Ralf Meier

Извините меня... но для меня весь код не имеет никакого смысла.
Я предлагаю следующее :
- попробуйте объяснить, чего вы хотите добиться
- показать весь соответствующий код - например, я не вижу, где ваш поток инстанцируется и запускается
- если вы работаете в потоке и хотите присвоить новые значения элементам управления приложения, вы должны использовать invoke для этого
- ваше приложение должно оставаться ответственным (это означает , что оно должно быть в состоянии реагировать в любое время)

Ralf Meier

дополнительный :
Если это" только " своего рода попытка, вы должны сначала попробовать ее с помощью таймера (и таймера.ТИК-событие для вашего метода), а не с потоком...

Philippe Mori

Читайте книги, учебные пособия или документацию по многопоточности. Нет смысла делать что-то подобное без глубокого понимания того, как работает резьба.

Если вы хотите приостановить чтение, то вам нужно хотя бы нить и правильное взаимодействие между ними. Существует множество способов сделать это (асинхронный / ожидающий, фоновый рабочий или пользовательские потоки...).

Philippe Mori

Это абсолютно не имеет никакого смысла вообще звонить Thread.Sleep из потока пользовательского интерфейса, так как ваше приложение перестанет отвечать в течение всего этого времени.

1 Ответов

Рейтинг:
0

OriginalGriff

Проблема, вероятно, будет заключаться в том, что у вас есть только один поток: единственный код, который вы показываете, который включает поток.Sleep работает в потоке пользовательского интерфейса (или вы получите исключения перекрестной потоковой передачи при доступе к текстовым полям), поэтому, если поток пользовательского интерфейса спит, элементы управления пользовательского интерфейса не работают. Даже если бы это было так, если DisplayText вызывается в потоке пользовательского интерфейса - а это так, - то никакой другой пользовательский интерфейс не может функционировать до тех пор, пока он не будет завершен. Чего он не делает...

Этот код довольно беден: почему вы загружаете один и тот же элемент управления и устанавливаете на него фокус несколько раз в цикле? Пользователь не увидит никаких обновлений до тех пор, пока метод не завершится, что, как только он запустится, он не будет делать. И goto- Почему?


vinodh muthusamy

Основываясь на моем требовании, я сделал свою циклическую структуру, но все эти циклы отличаются от excel.

Даже после удаления Гото немедленно, я не мог сосредоточиться на форме

OriginalGriff

Прочтите остальное, что я сказал...

vinodh muthusamy

Тогда каково же решение для 1 абзаца, о котором вы упомянули?

Можем ли мы использовать управление таймером для этой проблемы.

OriginalGriff

В принципе, переместите обработку из потока пользовательского интерфейса в фоновый поток, чтобы позволить пользовательскому интерфейсу делать это самостоятельно. Но вам нужно очень тщательно подумать о том, что вы пытаетесь сделать и что вы хотите показать пользователю в первую очередь.
На данный момент Вы ничего не показываете ему достаточно долго, чтобы прочитать, даже если поток пользовательского интерфейса может запустить его, чтобы показать ему. Итак, выясните, что вы пытаетесь сделать с точки зрения пользователя, а затем начните работать над тем, как это сделать!