Мой экран загрузки не закрывается

1

Я пытаюсь показать некоторый экран загрузки во время моей работы. Моя работа - просто переместить один файл за один раз из одной ячейки в другую, код работает отлично. Но when я am trying to move a group of files the loading screen is coming and after job its stuck for 20-30 seconds

Я нашел решение: its because after all the files are moved to the next column, my control is going to dataGridView1_DataBindingComplete так что происходит, что grid-cell дает цвет, основанный на моем состоянии, когда я удалял dataGridView1_DataBindingComplete свой рабочий префект.. Но Мне нужно дать цвет тоже.. скажите, пожалуйста, как я могу справиться с этой ситуацией.

коды:

    private void button3_Click(object sender, EventArgs e)
    {
        Hide();
        bool done = false;
        ThreadPool.QueueUserWorkItem((x) =>
        {
            using (var splashForm = new Form4())
            {
                splashForm.Show();
                while (!done)
                    Application.DoEvents();
                splashForm.Close();
            }
        });

        move(); // this is my function to move all files from one column to another
        done = true;
        Show();

    }

           private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        string strVal = ini.ReadValue("Action", "Doc-Controller");

        bool authenticated = true;
        string textboxGroupName1 = ini.ReadValue("Action", "Fabricator");
        if (authenticated == UserInCustomRole(textboxGroupName1))
        {

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                string fName1 = System.IO.Path.GetFileNameWithoutExtension(row.Cells[2].Value.ToString());
                string fName2 = System.IO.Path.GetFileNameWithoutExtension(row.Cells[3].Value.ToString());
                if (!string.IsNullOrEmpty(fName1) && !string.IsNullOrEmpty(fName2))
                {
                    var f1 = GetValue(fName1.ToCharArray()[fName1.Length - 2]) * 16 + GetValue(fName1.ToCharArray()[fName1.Length - 1]);
                    var f2 = GetValue(fName2.ToCharArray()[fName2.Length - 2]) * 16 + GetValue(fName2.ToCharArray()[fName2.Length - 1]);
                    //if (System.IO.Path.GetFileName(fName1) != System.IO.Path.GetFileName(fName2))
                    if (f1 > f2)
                    {
                        //MessageBox.Show(fName1);
                        DataGridViewCellStyle style = new DataGridViewCellStyle();
                        style.BackColor = Color.Yellow;
                        row.Cells[2].Style = style;
                    }
                    else if (f2 > f1)
                    {
                        //MessageBox.Show(fName1);
                        DataGridViewCellStyle style = new DataGridViewCellStyle();
                        style.BackColor = Color.Yellow;
                        row.Cells[3].Style = style;
                    }

                    if (f1 == f2)
                    {
                        DataGridViewCellStyle style = new DataGridViewCellStyle();
                        style.BackColor = Color.Plum;
                        row.Cells[3].Style = style;
                        row.Cells[2].Style = style;
                    }
                }
            }

        }

        if (authenticated == UserInCustomRole(strVal))
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                string fName1 = System.IO.Path.GetFileNameWithoutExtension(row.Cells[3].Value.ToString());
                string fName2 = System.IO.Path.GetFileNameWithoutExtension(row.Cells[4].Value.ToString());
                if (!string.IsNullOrEmpty(fName1) && !string.IsNullOrEmpty(fName2))
                {
                    var f1 = GetValue(fName1.ToCharArray()[fName1.Length - 2]) * 16 + GetValue(fName1.ToCharArray()[fName1.Length - 1]);
                    var f2 = GetValue(fName2.ToCharArray()[fName2.Length - 2]) * 16 + GetValue(fName2.ToCharArray()[fName2.Length - 1]);
                    //if (System.IO.Path.GetFileName(fName1) != System.IO.Path.GetFileName(fName2))
                    if (f1 > f2)
                    {
                        //MessageBox.Show(fName1);
                        DataGridViewCellStyle style = new DataGridViewCellStyle();
                        style.BackColor = Color.Yellow;
                        row.Cells[3].Style = style;
                    }
                    else if (f2 > f1)
                    {
                        //MessageBox.Show(fName1);
                        DataGridViewCellStyle style = new DataGridViewCellStyle();
                        style.BackColor = Color.Yellow;
                        row.Cells[4].Style = style;
                    }

                    if (f1 == f2)
                    {
                        DataGridViewCellStyle style = new DataGridViewCellStyle();
                        style.BackColor = Color.Plum;
                        row.Cells[4].Style = style;
                        row.Cells[3].Style = style;
                    }
                }
            }
        }
    }

    private int GetValue(char ch)
    {
        if (ch >= 48 && ch <= 57)
            return ch - 48;
        else if (ch >= 65 && ch <= 90)
            return ch - 65 + 10;
        else
            return 0;
    }
  • 1
    Поместите РАБОТУ в другую ветку, а не в диалог. Составьте список работы, которую нужно выполнить, и передайте ее в BackgroundWorker, чтобы работа была выполнена в другом потоке. Закройте диалог в событии RunWorkerCompleted () ...
  • 1
    Вы на самом деле не выполняли никаких РАБОТ внутри обработчика DoWork ()! Когда вы вызываете motion movement() прямо из обработчика нажатия кнопки button3, весь этот код выполняется в основном потоке пользовательского интерфейса. Вот почему ваша форма застревает. Работа внутри movement() должна быть вызвана из обработчика DoWork (). НО вы не должны читать напрямую из ваших компонентов пользовательского интерфейса изнутри. Вот почему я сказал, что вам нужно составить список своей работы и передать ее в RunWorkerAsync ().
Показать ещё 10 комментариев
Теги:
loading
splash-screen
formclosing

2 ответа

0

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

Button Click Handler
    Disable the Button
    Build a List of the Work to be done
    Pass List to RunWorkerAsync

DoWork Handler
    Cast e.Argument back to your List
    Call ReportProgress() with -1 as the param
    Iterate over the List and Do the Work
        ...after you move each file...
        Call ReportProgress() and pass the percentage complete as the first parameter,
            with the data to update the grid with in the second parameter
            *You can pass anything you want out in the second parameter, like a Custom Class

ProgressChanged Handler
    If e.ProgressPercent is -1 Then
        Display your Dialog
    Else
        Cast e.UserState to your progress structure and update the grid accordingly

RunWorkerCompleted Handler
    Close your dialog
    Re-enable the Button
  • 0
    я нашел ответ ... это происходит после того, как все файлы перемещены в следующий столбец, the control is going to dataGridView1_DataBindingComplete так что происходит, когда ячейка сетки дает цвет, основываясь на моем состоянии, когда я удалил dataGridView1_DataBindingComplete, он работает отлично ... Но мне нужно дать цвет тоже .. пожалуйста, скажите мне, как я могу справиться с этой ситуацией .. пожалуйста, смотрите мои обновленные коды
  • 0
    Application.DoEvents(); взято из WPF
0

Вы не можете закрыть тему, когда один из его детей жив. Для нашего случая это ваша Form4.

Попробуйте установить IsBackGround в true. Это позволит вашей теме умереть, даже если один из его детей жив:

private void button3_Click(object sender, EventArgs e)
{
    Thread thd = new Thread(new ThreadStart(SomeThread));
    thd.IsBackground = true;
    thd.Start();
    movement();
    dataGridView1.Refresh();
    thd.Abort();
}
  • 2
    Хотя технически это будет работать, это совершенно неправильный подход к проблеме.
  • 0
    @Idle_Mind любыми другими способами ... я подошел с помощью фонового работника и т работал ... но дело в том, что после перемещения большого количества файлов ... моя форма застревает на 20-30 секунд и возвращается в нормальное состояние ... but there is no problem while i am moving one file .. В чем может быть причина .. Пожалуйста, найдите мои отредактированные коды

Ещё вопросы

Сообщество Overcoder
Наверх
Меню