Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139

Режим ожидания.

17.02.2010, 22:10. Показов 3155. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

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

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

Проблема в том, что мне нужно остановить цикл в тот момент когда идет проверка меток и пока не появится переменная true или false не продолжит дальше прогон. Я не знаю как сделать этот момент ожидания.

Код который я пока использую без проверки напрямую (цыкл в кнопке пока):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        private void button1_Click(object sender, EventArgs e)
        {
            string strConnectionProvExl = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
            string strConnectionTypeExl = ";Extended Properties=Excel 8.0";
            if (this.listBox2.Items.Count > 0)
            {
                for (int i = 0; i < this.listBox2.Items.Count; i++)
                {
                    this.listBox2.SetSelected(i, true);
                    nAll._strConnectionPathExl = this.listBox2.Items[i].ToString();
                    nAll._strConnectionExl = strConnectionProvExl + nAll._strConnectionPathExl + strConnectionTypeExl;
                    //checkExcelMeta(); Вот эта процедура проверки, она отлажена и верно работает
                    oleDbConnection = new OleDbConnection(nAll._strConnectionExl);
                    adpExcel = new OleDbDataAdapter("Select * from [База$];", oleDbConnection);
                    dtExcel = new DataTable();
                    adpExcel.Fill(dtExcel);
                    /////
                    for (int iL = 0; iL < dtExcel.Rows.Count; iL++)
                    {
                        ///Для собственной проверки
                        this.listBox1.Items.Add(dtExcel.Rows[iL][0].ToString() + " | " +
                            dtExcel.Rows[iL][1].ToString() + " | " +
                            dtExcel.Rows[iL][2].ToString() + " | " +
                            dtExcel.Rows[iL][3].ToString() + " | " +
                            dtExcel.Rows[iL][4].ToString() + " | " +
                            dtExcel.Rows[iL][5].ToString() + " | " +
                            dtExcel.Rows[iL][6].ToString() + " | " +
                            dtExcel.Rows[iL][7].ToString() + " | " +
                            dtExcel.Rows[iL][8].ToString());
                        //
                    }
                    ////готовятся данные для таблички в базе
                    for (int iR = 1; iR < 6; iR++)
                    {
                        dtRow = dtDb.NewСборыRow();
                        dtRow.Код_налога = Convert.ToInt32(dtExcel.Rows[iR][2]);
                        dtRow.Код_субъекта = Convert.ToInt32(dtExcel.Rows[0][2]);
                        dtRow.Год = Convert.ToInt16(dtExcel.Rows[0][0]);
                        dtRow.Собрано = Convert.ToInt32(dtExcel.Rows[iR][7]);
                        dtDb.AddСборыRow(dtRow);
                    }             
                    adpDb.Update(dtDb);
                    this.сборыTableAdapter.Fill(this._База_по_налогам_быстрая_DataSet.Сборы);
                }
                oleDbConnection.Close();
            }
 
        }
Спасибо, Илья.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2010, 22:10
Ответы с готовыми решениями:

Форма ожидания
Всем привет! Я видел и тут и в инете посты про потоки и про формы, но вот как совместить нормально я додумкать не могу... Есть основная...

Ожидания в Selenium
Приветствую, ребята! Подскажите пожалуйста по такому вот вопросу. В проекте использую Selenium 3.6. Хотелось бы разобраться с ожиданиями,...

Паток ожидания соединения
Подскажите почему форма зависает ? new Connect(delegate() { Conect(); }).BeginInvoke(null, null); private void Conect() ...

5
46 / 46 / 19
Регистрация: 15.03.2009
Сообщений: 178
18.02.2010, 02:47
Честно говоря не совсем поняла задачу.
Но вот, что касается остановки до появления метки то эта довольно тривиально, например:
C#
1
2
3
4
5
while (true)
{
  //метод checkExcelMeta() выполняется до тех пор пока не возвратит false
  if (!checkExcelMeta()) break;
}
1
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139
18.02.2010, 17:50  [ТС]
Ну вот, это оказалось не так уж и сложно.

Спасибо за ответ.

ПС: Метод после завершения возвращает true/false после своего завершения?

Добавлено через 2 часа 11 минут
Покурочил я свой цикл, покурочил, пришел к тому, что разделил процедуру проверки и перетаскивание инфы в бд на две части. Первая часть проверяет ексель лист на наличие метки. Проверка идет в цикле так, как есть множество файлов, которые пользователь закинул в листбокс. Перебираются все файлы по очереди, в каком то файле не хватает меток, то предлагается их ввести. Затем файл сохраняется с метками и переходит к следующим.
Я так и не смог решить проблему, чтобы цикл останавливался в тот момент, когда открывается форма для ввода и продолжался, когда она закрывается. Когда форма закрывается, устанавливается значение true для глобальной переменной. По умолчанию она false.

Подскажите каким образом это можно сделать.
Пока код выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
        private void button1_Click(object sender, EventArgs e)
        {
            string strConnectionProvExl = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
            string strConnectionTypeExl = ";Extended Properties=Excel 8.0";
            if (this.listBox2.Items.Count > 0)
            {
                for (int i = 0; i < this.listBox2.Items.Count; i++)
                {
                    nAll._metaOk = false;
                    this.listBox2.SetSelected(i, true);
                    nAll._strConnectionPathExl = this.listBox2.Items[i].ToString();
                    nAll._strConnectionExl = strConnectionProvExl + nAll._strConnectionPathExl + strConnectionTypeExl;
                    openExcelForCheck();
                }
            }
 
        }
        private void openExcelForCheck()
        {
            //Excel.Range range;
            //
            
            //
            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Open(nAll._strConnectionPathExl,0,false, 5, "", "",false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            int N = xlWorkBook.Worksheets.Count;
            //
            string[,] collectSheets = new string[N, 2];
            //
            for (int i = 0; i < N; i++)
            {
                collectSheets[i, 0] = Convert.ToString(i + 1);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(i + 1);
                collectSheets[i, 1] = xlWorkSheet.Name;
            }
            //
            int xlIndexSheet = 0;
            //
            for (int i = 0; i < N; i++)
            {
                if (collectSheets[i, 1] == "База")
                {
                    xlIndexSheet = Convert.ToInt32(collectSheets[i, 0]);
                }
            }
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(xlIndexSheet);
            if (!checkExcelMeta())
            {
                WindowsApplication7.enterMeta frmEnMeta = new enterMeta(nAll, this);
                frmEnMeta.Show();
            }
        }
        private bool checkExcelMeta()
        {
            try
            {
                nAll._metaYear = xlWorkSheet.get_Range("A2", "A2").Value2.ToString();
            }
            catch (System.Exception)
            {
                nAll._metaYear = "";
            }
            try
            {
                nAll._metaSubject = xlWorkSheet.get_Range("B2", "B2").Value2.ToString();
            }
            catch (System.Exception)
            {
                nAll._metaSubject = "";
            }
            try
            {
                nAll._metaCode = xlWorkSheet.get_Range("C2", "C2").Value2.ToString();
            }
            catch (System.Exception)
            {
                nAll._metaCode = "";
            }
            if (nAll._metaCode == "" || nAll._metaSubject == "" || nAll._metaYear == "")
            {
                return false;
            }
            return true;
        }
ПС: Может еще кто знает каким образом можно узнать Ид нужного листа по его имени в екселе другим способом.

Спасибо.
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
18.02.2010, 18:10
не вникал в суть, возможно не в кассу, но остановить поток до какого-то момента можно с помощью класса ManualResetEvent
например
C#
1
2
3
4
5
ManualResetEvent varName = new ManualResetEvent(true);
 //по умолчанию как бы выключен, т.е не остановит ничего
 
//затем в том месте где надо остановиться ставишь 
varName.WaitOne(); //поскольку true остановки нет, он пропускается
а когда нужно остановиться, например по условию какому-то
C#
1
2
varName.Reset(); //после этого поток в котором есть varName.WaitOne();  ждет
//и продолжить varName.Set // соответственно это должно быть в рабочем потоке
0
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139
18.02.2010, 18:10  [ТС]
Решил задачу так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public void checkFiles()
        {
            if (this.listBox2.Items.Count > 0)
            {
                for (int i = indexAction; i < this.listBox2.Items.Count; i++)
                {
                    nAll._metaOk = false;
                    this.listBox2.SetSelected(i, true);
                    nAll._strConnectionPathExl = this.listBox2.Items[i].ToString();
                    nAll._strConnectionExl = strConnectionProvExl + nAll._strConnectionPathExl + strConnectionTypeExl;
                    openExcelForCheck();
                    if (!nAll._metaOk) { indexAction = i; break; }
                    else { closeExcel(); }
                }
            }
        }
Потом, если что-то ввели в форму и закрыли то цикл продолжается с нужного мест.

Вот.
Теперь есть другая проблема: не убивается процесc Excel в диспетчере задач. Закрываю ексель так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        private void closeExcel()
        {
object misValue = System.Reflection.Missing.Value;
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();
 
            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);
        }
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
Если, что не правильно, подскажите плз, чтобы не создавать тему новую.
0
46 / 46 / 19
Регистрация: 15.03.2009
Сообщений: 178
19.02.2010, 02:50
Цитата Сообщение от KIMka Посмотреть сообщение
Я так и не смог решить проблему, чтобы цикл останавливался в тот момент, когда открывается форма для ввода и продолжался, когда она закрывается. Когда форма закрывается, устанавливается значение true для глобальной переменной. По умолчанию она false.
Если frmEnMeta возвращает значение trabl, можно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
if (!checkExcelMeta())
{
   int i = 0;
   while(!trabl)
   {
      if (i==0)
      {
         WindowsApplication7.enterMeta frmEnMeta = new enterMeta(nAll, this);
         frmEnMeta.Show();
         i++;
      }
   }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2010, 02:50
Помогаю со студенческими работами здесь

Ожидания завершения метода
Добрый день! Возник вопрос, не могу понять как правильно сделать. Задача вот в чем. Есть проект в котором одно окно. Все методы...

Методы ожидания задачи
Есть 3 задачи первая задача заполняет данные и записывает в файл вторая считывает из файла на экран третья задача берет эти данные...

Выход из режима сна/ожидания/гибернации
Можно ли программно вывести ПК из режима сна/ожидания? Добавлено через 3 минуты Собственно стоит задача создать будильник, который...

Команды ожидания - Timer , Sleep , Wait?
Делаю секундомер , для него нужны команды ожидания . А их в C# нет ) . Помогите решить проблему . Заранее спасибо.

COM-порт: как добиться ожидания ответа
Работаю с GSM модемом. Отправляю команду набора номера и нужно прочитать ответ когда начнется разговор(Ответ выглядит как &quot;ок&quot;)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru