Змінюй хід війни! Допомагай ЗСУ!

Задержка в C#

🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
Статус: Offline
Реєстрація: 07.02.2010
Повідом.: 316
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #1
Задержка в C#

Короче говоря нужно сделать что бы элементы массива выводились после сортировки не сразу, а например через каждую секунду...

private void SortingByBubble(object sender, EventArgs e)
{

string buffer = textBox1.Text;
string[] StringArray = buffer.Split(' ');
int[] MembersOfArray = new int[StringArray.Length];
for (int i = 0; i < MembersOfArray.Length; i++)
MembersOfArray = Convert.ToInt32(StringArray);
MembersOfArray = Bubble.bubble(MembersOfArray, 4);

buffer = null;
for (int i = 0; i < MembersOfArray.Length; i++)
{
buffer += Convert.ToString(MembersOfArray);

buffer += " ";

}

textBox2.Text = buffer;

}

Преобразуйте код или под скажите как такое сделать....
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #2
using System.Threading;

Thread.Sleep(int) добавь в свой цикл. В качестве аргумента задержка в миллисекундах, если мне не изменяет память
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #3
for (int i = 0; i < buffer.Length; i++)
{
Thread.Sleep(100);
textBox2.Text += buffer.ToString();

}

Вот так вы имеете в виду???
Так не работает просто через некоторое время выводит весь массив
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #4
в c# нет чегото типа

sleep 5000 ?
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #5
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #6
Мну мне нужно что бы оно віводило каждый элемент массива с задержкой, а так тупо через Sleep оно ждет маленько, а потом тупо сразу выводит весь массив

Что бы выводилось в textBox
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #7
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #8
WindowsForms
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #9
Беда в том, что обработчик события исполняется в главном UI потоке и, соответственно, весь UI висит до конца сортировки. Чтобы всё было хорошо, нужен второй поток. Можно попробовать примерно следующим образом:

Код:
delegate void SetTextBoxTextDelegate(string text);

private void SetTextBox2Text(string text)
{
	if (InvokeRequired)
	{
		Invoke((SetTextBoxTextDelegate)SetTextBox2Text, text);
		return;
	}
	textBox2.Text = text;
}

private void BackgroundSortingByBubble(object initialTextObj)
{
	string initialText = (string)initialTextObj;
	string[] StringArray = initialText.Split(' ');
	int[] MembersOfArray = new int[StringArray.Length];
	for (int i = 0; i < MembersOfArray.Length; i++)
		MembersOfArray[i] = Convert.ToInt32(StringArray[i]);
	MembersOfArray = Bubble.bubble(MembersOfArray, 4);

	StringBuilder buffer = new StringBuilder(initialText.Length+1);
	for (int i = 0; i < MembersOfArray.Length; i++)
	{
		buffer.AppendFormat("{0} ", MembersOfArray[i]);
		SetTextBox2Text(buffer.ToString());
		Thread.Sleep(1000);
	}
}

private void SortingByBubble(object sender, EventArgs e)
{
	ThreadPool.QueueUserWorkItem(BackgroundSortingByBubble, textBox1.Text);
}

Код не компилировался ни разу, т.е. ошибок может быть выше крыши, но, думаю, идея должна быть ясна.
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #10
Код не компилировался ни разу, т.е. ошибок может быть выше крыши, но, думаю, идея должна быть ясна.

Все правильно сказал, но боюсь у него щас точно крышу снесет. Плохо когда люди не знают что такое Win32 API, message loop и все что с ним связано :)
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #11
и одной ошибки))) и все заработало))) спасибо))
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #12
А идею-то понял? :D
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #13
странное решение выводить массив в текстбокс :)
Для простоты понимания можно было воспользоваться таймером, интервалом которого была бы желаемая задержка, а в обработчике тика делать вывод.

Беда в том, что обработчик события исполняется в главном UI потоке и, соответственно, весь UI висит до конца сортировки. Чтобы всё было хорошо, нужен второй поток.

Конечно вносить задержку в основной поток программы ради такой фигни это не рационально и не правильно, и все таки мне непонятно почему весь поток висит до конца сортировки, если ТС вставляет задержку внутри цикла :confused:
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #14
Потому что он потом выводит элементы массива, он Thread.Sleep пихал перед буфером,
а потом выводил весь буфер одним Console.Write.

Где-то так...

З.Ы. Не увидел, что Forms. Там все окно лочится до конца выполнения кода.
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #15
Можно так:
Код:
private void SortingByBubble(object sender, EventArgs e)
{
   string buffer = textBox1.Text;
   string[] StringArray = buffer.Split(' ');
   int[] MembersOfArray = new int[StringArray.Length];
   for (int i = 0; i < MembersOfArray.Length; i++)
      MembersOfArray[i] = Convert.ToInt32(StringArray[i]);
   MembersOfArray = Bubble.bubble(MembersOfArray, 4);

   buffer = null;
   for (int i = 0; i < MembersOfArray.Length; i++)
   {
      buffer += Convert.ToString(MembersOfArray[i]);

      buffer += " ";
      [b]textBox2.Text = buffer;
      textBox2.Refresh();
      Thread.Sleep(1000);[/b]
   }
}

внесенные измененения выделил жирным

но лочить гуёвый поток очень нехорошо, поэтому практичней использовать таймер. Можно конечно и поток из пула заюзать, но имхо это хуже чем таймер, кстати делать вызов через Invoke (т.е. отправить сообщение окну, при обработке которого будет произведен вызов) операция довольно опасная, т.к. без понимания как это все работает может запросто привести к дедлоку
 
Останнє редагування:
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #16
всем спасибо за ответы и советы)))
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #17
имхо - таймер и по каждому тику выводить элемент
 
  • 🟠 22:36 Загроза застосування КАБЗагроза застосування керованих авіаційних бомб#м_Харків_та_Харківська_територіальна_громада
  • #18
Чисто на правах флуда: Как говорил мой трудовик - "Задержка не у нас и не в том месте" (с)
 
Назад
Зверху Знизу