Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность 
V
    Опции темы
Madrid
Дата 22.7.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



Вобщем такая задача!
На форме есть два листбокса и кнопка!
Жму на кнопку - запускается процес генерации случаиных чисел(в диапазоне от 0 до 1000).
Я жду когда выпадет нужное мне число(например 703) и тогда добавляю его в один из листбоксов, во второй листбокс я добавляю номер итерации, на которой, оно выпало!
Эта всё происходит в отдельном потоке!
вот код:
Код

namespace WindowsApplication5
{
    public partial class Form1 : Form
    {        
        private delegate void ShowProgressDelegate(Int32 a, Int32 b);

        public Form1()
        {
            InitializeComponent();            
        }

        void ShowProgress(Int32 a, Int32 iter)
        {
            listBox1.Items.Add(a);            
            listBox2.Items.Add(iter);                        
        }

        void Work()
        {
            bool b = true;
            Int32 count = 0;
            Int32 iteration = 0;

            ShowProgressDelegate showProg = new ShowProgressDelegate(ShowProgress);
            

            while (b)
            {
                iteration++;
                Random r = new Random();
                Int32 a = r.Next(0, 1000);
                if (a == 703)
                {
                    this.Invoke(showProg, new object[] { a, iteration });                    
                    count++;                    
                }
                if (count == 20)
                {
                    b = false;                    
                }                
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            Thread t = new Thread(new ThreadStart(Work));
            t.Start();              
        }                     
    }
}

Проблема в том, что загаданное число(703), добавляется в листбокс пачкой, по несколько штук, причем получается так что загаданное число выпадает 8 или 10 раз подряд(бред какой-то)!Такого же неможет быть!В чём ошибка!И ещё сделайте какие-нибудь замечания по поводу потока(всё ли правильно я сделал).Зараннее - спасибо!
 

PM MAIL   Вверх
alhimik
Дата 22.7.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.7.2007

Репутация: 1
Всего: 1



Сразу воспоминания randomize из Pascal...но суть в том, что Вам нужно сделать маленькое изменение:

Код

            Random r = new Random();
            while (b)
            {
                iteration++;
                Int32 a = r.Next(0, 1000);

тогда прога и верно и быстро работает...

Это сообщение отредактировал(а) alhimik - 22.7.2007, 14:11
PM ICQ   Вверх
Madrid
Дата 22.7.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



Да, это помогло!
Но что изменилось?Я чего-то непонял?
PM MAIL   Вверх
alhimik
Дата 22.7.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.7.2007

Репутация: 1
Всего: 1



В данном примере используется конструктор Random(), который в качестве источника (seed value) использует системное время. Можно предположить, что время выполнения одной итерации цикла while (b) постоянное. Так как каждый раз создается новый Random(), то может быть значение seed является каждый раз одинаковым. Соответственно генерируются серии одинаковых значений. 
Как говорит докумментация - "The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated. One way to produce different sequences is to make the seed value time-dependent, thereby producing a different series with each new instance of Random."
...но это всего лишь домыслы. Чесно говоря я не могу истолковать почему должно быть именно так, как я написал, но  я знаю, что так должно быть, интуитивно... smile

Если юзать Delphi с таким исходником:
Код

  int   : Integer;
  i     : Integer;

begin
  // Если Вы выполните эту программу дважды, гарантируется, что только 
  // первые 5 значений randomize
  // снова установит в различную часть
  // псевдо случайной последовательности чисел.

  // Получение случайного целого числа в диапазоне 1..100
  ShowMessage('Первые 5 фиксированных чисел');
  for i := 1 to 5 do
  begin
    int := 1 + Random(100);    // Эти 100 значений дают диапазон 0..99
    ShowMessage('int = '+IntToStr(int));
  end;

  // Теперь, чтобы снова установить выполняем randomize
  Randomize;
  ShowMessage('');

  // Получение случайного целого числа в диапазоне 1..100
  ShowMessage('Следующие 5 случайных чисел');
  for i := 1 to 5 do
  begin
    int := 1 + Random(100);    // Эти 100 значений дают диапазон 0..99
    ShowMessage('int = '+IntToStr(int));
  end;
end;

То результат запуска приложения два раза подряд таков:

Код

1.
Первые 5 фиксированных чисел
int = 1
int = 4
int = 87
int = 21
int = 28

Следующие 5 случайных чисел
int = 29
int = 4
int = 96
int = 63
int = 21

2.
Первые 5 фиксированных чисел
int = 1
int = 4
int = 87
int = 21
int = 28

Следующие 5 случайных чисел
int = 44
int = 21
int = 30
int = 20
int = 5

То есть можно считать что:
Delphi - C#
Randomize  - Random()
Random(100) - r.Next(0, 1000);

PM ICQ   Вверх
Madrid
Дата 22.7.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



Спасибо!Вроде разобрался!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1200 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.