Задержка в C#

Статус: Offline
Реєстрація: 07.02.2010
Повідом.: 316
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #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;

}

Преобразуйте код или под скажите как такое сделать....
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #2
using System.Threading;

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

}

Вот так вы имеете в виду???
Так не работает просто через некоторое время выводит весь массив
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #4
в c# нет чегото типа

sleep 5000 ?
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #6
Мну мне нужно что бы оно віводило каждый элемент массива с задержкой, а так тупо через Sleep оно ждет маленько, а потом тупо сразу выводит весь массив

Что бы выводилось в textBox
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #7
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #8
WindowsForms
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #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);
}

Код не компилировался ни разу, т.е. ошибок может быть выше крыши, но, думаю, идея должна быть ясна.
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #10

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


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

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

З.Ы. Не увидел, что Forms. Там все окно лочится до конца выполнения кода.
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #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 (т.е. отправить сообщение окну, при обработке которого будет произведен вызов) операция довольно опасная, т.к. без понимания как это все работает может запросто привести к дедлоку
 
Останнє редагування:
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #16
всем спасибо за ответы и советы)))
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #17
имхо - таймер и по каждому тику выводить элемент
 
  • 🔴 16:00 Повітряна тривога в Харків.обл.
  • #18
Чисто на правах флуда: Как говорил мой трудовик - "Задержка не у нас и не в том месте" (с)