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

Задержка в C#

  • Автор теми Автор теми JoyStick 0_o
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 07.02.2010
Повідом.: 316
Задержка в 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;

}

Преобразуйте код или под скажите как такое сделать....
 
using System.Threading;

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

}

Вот так вы имеете в виду???
Так не работает просто через некоторое время выводит весь массив
 
в c# нет чегото типа

sleep 5000 ?
 
Мну мне нужно что бы оно віводило каждый элемент массива с задержкой, а так тупо через Sleep оно ждет маленько, а потом тупо сразу выводит весь массив

Что бы выводилось в textBox
 
Беда в том, что обработчик события исполняется в главном 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);
}

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

Все правильно сказал, но боюсь у него щас точно крышу снесет. Плохо когда люди не знают что такое Win32 API, message loop и все что с ним связано :)
 
и одной ошибки))) и все заработало))) спасибо))
 
А идею-то понял? :D
 
странное решение выводить массив в текстбокс :)
Для простоты понимания можно было воспользоваться таймером, интервалом которого была бы желаемая задержка, а в обработчике тика делать вывод.

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

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

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

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