powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / где грабли?! Application.DoEvents();
10 сообщений из 10, страница 1 из 1
где грабли?! Application.DoEvents();
    #32842435
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемые, помоги разобраться со следующей проблемой:

требуется печатать квитанции и одновременно сканировать их штрих-код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
foreach(int indexChecked in printList.CheckedIndices) 
{
	if(stopPrinting)break;	//stopPrinting - флаг остановки печати
	//(меняет сосотояние в обработчиках MouseDown для соответствующих кнопок)
	
	(...)	// подготовка документа к печати, вывод соответствующей информации пользователю

	_box.Print();	//отправка документа на печать

	tbParcelNum.Text = ""; //tbParcelNum - ТекстБокс, куда выводится информация со сканера

	do
	{
		tbParcelNum.Focus();
		Application.DoEvents();
		if(stopPrinting)break;
	}	while (!CorrectParcelNum);	//штрих-код отсканирован корректно
	if(stopPrinting)break;
	LastParcelNumber = tbParcelNum.Text;	//сохраняем код последней квитанции

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

}
Проверка корректности штрих-кода осуществляется в обработчике tbParcelNum_TextChanged
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
private void tbParcelNum_TextChanged(object sender, System.EventArgs e)
{
	timer.Stop();	timer.Start();

	CorrectParcelNum = false;

	if(tbParcelNum.Text != LastParcelNumber)	//проверка на равенство с предыдущим номером
	{
		if(CheckParcelNumber(tbParcelNum.Text))	//проверка штрих кода
		{
			timer.Stop();
			CorrectParcelNum = true;
		}
	}
	else
		tbParcelNum.Text = string.Empty;
}

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
	timer.Stop();
	tbParcelNum.Text = string.Empty;
}
проблема заключается в том, что происходит печать и сканирование только первой квитанции, дальше процесс повисает в ожидании сигнала от сканера...
как я понимаю, проблема заключается в Application.DoEvents();

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

зыы. и еще, если отключить печать и произвести тестирование сканера, то остановка процесса происходит корректно, при нажатии соответствующих кнопок.
Но если в цикле поставить счетчик количества отсканированных квитанцый и при достижении определенного количества вызвать PauseBtn_MouseDown (пауза в печати), тогда, после выхода из процедуры происходит возврат в нее же!!

зыыы. пока писал все это, до меня вроде дошло, что может возвращать обратно в цикл:
во втором пропущенном участке кода у меня есть такая строка printList.SetItemChecked(indexChecked, false);

зыыыы. да, и последний вопрос: корректен ли сам подход к решению задачи? если нет, то как лучше реализовывать?
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32843892
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
друзья!!
подскажите куда копать?!

зы. или лень вникать?
ззы. я же... до меня вроде дошло, что может возвращать обратно в цикл:
во втором пропущенном участке кода у меня есть такая строка printList.SetItemChecked(indexChecked, false);от этого избавился, глюк не устранился

зззы. ответьте хотябы на вопрос о корректности подхода к решению...
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32844342
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Профиль! :-)

Хмм...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
private void tbParcelNum_TextChanged(object sender, System.EventArgs e) {

  /// ...

  tbParcelNum.Text = string.Empty;

  /// ...

}
Обработчик события зациклен сам на себя. Потому и виснет.
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32844463
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет, Роман!

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

строку я выкинул, т.к. все равно она обнулится по таймеру...
есть еще какие-либо предположения?
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32844493
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл упомянуть: если я пытаюсь поймать глюк в отладчике - все проходит как и задумывалось...
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32844599
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> есть еще какие-либо предположения?

Да.

Сразу бросается в глаза конструкция, которая пожирает все свободные ресурсы процессора:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
///...

  do
  {
    tbParcelNum.Focus();
    Application.DoEvents();
    if(stopPrinting)break;
  } while (!CorrectParcelNum);

///...

Используй семафоры, что бы разрулить ситуацию. Посмотри в сторону класса WaitHandle и его производных.

Да. И вот еще - что это за сканер такой, что для него надо устанавливать фокус ввода на элемент tbParcelNum? Он вместо клавиатуры подключается? Может есть возможность использовать более правильный сканер, интерфейс которого позволяет получать данные в виде потока?
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32844686
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, сканер подключается параллельно с клавиатурой, другой предоставить не могут, поэтому и приходится фокус ставить.
про WaitHandle посмотрю, спасибо
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32846671
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мдя... странно все это... сегодня случайно запустил процесс - все прошло корректно... причем в пятницу все было плохо... видать тяжелая была неделя
//проверка корректности штрих-кода была убрана из обработчика tbParcelNum_TextChanged

но раз уже начал разбираться, тем более мне всегда не нравилась конструкция с DoEvents()
2 Роман
посмотрел я WaitHandle и его производные, в часности ManualResetEvent

но как-то не могу въехать, как мне организовать процесс...
не могли бы поделиться советом?
...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32847222
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так:

Код: plaintext
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.
///...

  // do
  // {
    tbParcelNum.Focus();

  //  Application.DoEvents();
  //  if(stopPrinting)break;

    WaitHandle.WaitAny(new ManualResetEvent[]{stopPrintingEventHandle, correctParcelNumEventHandle});

  //  } while (!CorrectParcelNum);
  if(stopPrinting)break;

///...

private void tbParcelNum_TextChanged(object sender, System.EventArgs e)
{
///...
  correctParcelNumEventHandle.Reset();
///...

      timer.Stop();
      correctParcelNumEventHandle.Set();

///...
}

...
Рейтинг: 0 / 0
где грабли?! Application.DoEvents();
    #32847293
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>>> где грабли?!

Я бы сказал так - первоначально написанный кусок - одна сплошная грабля.
Всвязи с дурацким интерфейсом сканера здесь надо жестко разруливать межпроцессное взаимодействие. На твоем месте я вообще распихал бы все задачи (печать, проверку считанного кода, сбор вводимых данных с клавиатуры (сканера), общее управление процессом) по разным thread'ам и рулил бы дальше с помощью семафоров.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / где грабли?! Application.DoEvents();
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]