powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Out of range проблема.
24 сообщений из 24, страница 1 из 1
Out of range проблема.
    #39914132
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я по таймеру запускаю опрос в цикле
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void timerReadCyc_Tick(object sender, EventArgs e)
{
    for (g_read_idx = 0; g_read_idx < read_reg_list.Length; g_read_idx++)
    {
          udpNetwork.ReadRegValue(read_reg_list[g_read_idx]);   //посылка по UDP
                      
    }              
}



в другом методе я получаю ответ и показываю его в списке
Код: c#
1.
2.
3.
4.
5.
6.
7.
public void updateRegReadValue(int Regvalue)
{
    Invoke((MethodInvoker)delegate ()
    {    
            listViewRead.Items[g_read_idx].SubItems[1].Text = Regvalue.ToString("X");
    });
}


и тут я получаю OutOfRange Exeption - g_read_idx индекс принимает значение равное read_reg_list.Length (длина списка).

я прнимаю что методы не синхронизированы - но как, как индекс может выйти из границ?
кроме условия for (g_read_idx = 0; g_read_idx < read_reg_list.Length; g_read_idx++) индекс не модифицируется ни в каком другом месте.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914140
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
read_reg_list[] и listViewRead.Items[] это разные массивы, они не обязаны быть одного размера. Посмотри размер обоих в отладчике.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914143
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
g_read_idx индекс принимает значение равное read_reg_list.Length (длина списка).
Всё верно, он принимает такое значение после окончания цикла, почему оно должно быть какое-то другое? Иначе как у тебя выполнится проверка условия выхода из цикла.

Код - жесть вообще
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914146
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
read_reg_list[] и listViewRead.Items[] это разные массивы, они не обязаны быть одного размера. Посмотри размер обоих в отладчике.

я заполняю лист массивом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 private void PopulateReadListView()
{
    int i;

    listViewRead.Items.Clear();

    for (i = 0; i < read_reg_list.Length; i++)
    {
         string[] row = { read_reg_list[i], " " };
         ListViewItem item = new ListViewItem(row);
         listViewRead.Items.Add(item);
   }
}
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914152
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
jenya7
g_read_idx индекс принимает значение равное read_reg_list.Length (длина списка).
Всё верно, он принимает такое значение после окончания цикла, почему оно должно быть какое-то другое? Иначе как у тебя выполнится проверка условия выхода из цикла.

Код - жесть вообще

добавил проверку
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public void updateRegReadValue(int Regvalue)
{
    Invoke((MethodInvoker)delegate ()
    { 
           if (g_read_idx < read_reg_list.Length )
                listViewRead.Items[g_read_idx].SubItems[1].Text = Regvalue.ToString("X");
    });
}


но из за того что цикл не синхронизирован с ответом g_read_idx всегда равен read_reg_list.Length.

попробовал синхронизировать так
Код: c#
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.
private void timerReadCyc_Tick(object sender, EventArgs e)
{
    for (g_read_idx = 0; g_read_idx < read_reg_list.Length; g_read_idx++)
    {
          udpNetwork.ReadRegValue(read_reg_list[g_read_idx]);   //посылка по UDP
          
          while (response == 0)
         {
              timeout++;
              Thread.Sleep(1);
              
             if (timeout > 100) break;
         } 

       response = 0;
                      
    }              
}

public void updateRegReadValue(int Regvalue)
{
    Invoke((MethodInvoker)delegate ()
    {    
           response = 1;
           listViewRead.Items[g_read_idx].SubItems[1].Text = Regvalue.ToString("X");
    });
}


но что то не работает. как лучше сделать?
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914182
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
как лучше сделать?
сделать что? Начни с подробного описания задачи и среды её реализации. Думаешь, по кускам неработающего кода можно её восстановить?
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914193
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
jenya7
как лучше сделать?
сделать что? Начни с подробного описания задачи и среды её реализации. Думаешь, по кускам неработающего кода можно её восстановить?

мне надо синхронизировать посылку и прием.

посылка
Код: c#
1.
udpNetwork.ReadRegValue("аааа");



прием в другом потоке - вызывается этот метод
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public void updateRegReadValue(int Regvalue)
{
    Invoke((MethodInvoker)delegate ()
    {    
           response = 1;
           listViewRead.Items[0].SubItems[1].Text = Regvalue.ToString("X");
    });
}



одиночная посылка-прием работают без проблем уже год как.

теперь нужно сделать это в цикле
Код: c#
1.
2.
3.
4.
5.
6.
7.
private void timerReadCyc_Tick(object sender, EventArgs e)
{
    for (g_read_idx = 0; g_read_idx < read_reg_list.Length; g_read_idx++)
    {
          udpNetwork.ReadRegValue(read_reg_list[g_read_idx]);   //посылка по UDP            
    }              
}


и тут все ломается так как цикл посылает весь массив не дожидаясь ответа.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914211
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
мне надо синхронизировать посылку и прием.
Это не описание задачи.
Посылку чего? Прием чего? Это в пределах приложения или это разные приложения? Почему используется именно такой способ, а не штатные средства синхронизации? Почему разделяется поле между потоками без какого либо использования безопасности потоков?
Этот код - бред, а чтобы посоветовать что-то конкретное - надо знать задачу, а ты ее не описываешь. Опиши задачу БЕЗ ПРИМЕРОВ КОДА. Полностью словами.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914238
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
jenya7
мне надо синхронизировать посылку и прием.
Это не описание задачи.
Посылку чего? Прием чего? Это в пределах приложения или это разные приложения? Почему используется именно такой способ, а не штатные средства синхронизации? Почему разделяется поле между потоками без какого либо использования безопасности потоков?
Этот код - бред, а чтобы посоветовать что-то конкретное - надо знать задачу, а ты ее не описываешь. Опиши задачу БЕЗ ПРИМЕРОВ КОДА. Полностью словами.

я не понимаю что тут может быть непонятно. даже я все уже понял.
посылаем 6 байт по UDP. прибор возвращает ответ. поток принимающий ответ запущен.
Код: c#
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.
29.
30.
31.
32.
33.
 public void rxing()
 {
     while (Global_Parameter.UDP_NETWORK_FLAG)
     {
          try
          {
               rxSize = rxSock.Receive(rxBuffer);
               if (rxSize > 0)
               {
                   udpRXData(rxBuffer, rxSize);
                   rxSize = 0;
               }
          }
          catch (Exception ex)
          {
               if (ex.HResult == (double)0x80131530 || ex.HResult == (double)0x800040050)
                   MessageBox.Show(ex.ToString());
          }
    }
}

private void udpRXData(byte[] rcvUdpData, int rcvSize)      
{
    UInt32 opCode = BitConverter.ToUInt32(rcvUdpData, 0);
    switch (opCode)
    {
         case R_REG_Receive:
          {
              main.updateRegReadValue(BitConverter.ToInt32(rcvUdpData, 4));
              break;
         }
    }
}



пришел ответ - вызвался updateRegReadValue - показал данные.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914253
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
посылаем 6 байт по UDP. прибор возвращает ответ.
Тогда почему ты считаешь, что цикл отправки должен ждать, когда сработает приёмник, а не выполняться сразу и до конца? Мы должны догадаться, как устроен метод ReadRegValue?
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914256
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты хочешь отправлять следующий запрос только поле того, как пришел ответ на предыдущий, тебе нужно именно это и написать, а не какие-то странные слипы втыкать методом тыка.

Но сначала придется изучить темы многопоточности, асинхронности, безопасности потоков.
Написанный код нужно выкинуть.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914303
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Если ты хочешь отправлять следующий запрос только поле того, как пришел ответ на предыдущий, тебе нужно именно это и написать, а не какие-то странные слипы втыкать методом тыка.

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

это простая утилита для проверки. считать регистры с прибора и вся музыка. я не хочу сейчас писать новый проект. как в цикле подождать ответ?
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914314
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе не нужно в цикле ЖДАТЬ ответ. Тебе нужно. чтобы факт прихода ответа инициировал отправку следующего запроса. Очередь нужно организовать. Очередь опустела, процесс закончился.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914335
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Тебе не нужно в цикле ЖДАТЬ ответ. Тебе нужно. чтобы факт прихода ответа инициировал отправку следующего запроса. Очередь нужно организовать. Очередь опустела, процесс закончился.

а как? можно пример?
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914407
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример чего? Как использовать Queue или ConcurrentQueue? Примеры в документации.


jenya7
я не понимаю что тут может быть непонятно. даже я все уже понял.



jenya7
пришел ответ - вызвался updateRegReadValue - показал данные.
...отправил следующий запрос из очереди
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914425
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно тебе поможет pipeline-паттерн .
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914428
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Пример чего? Как использовать Queue или ConcurrentQueue? Примеры в документации.


jenya7
я не понимаю что тут может быть непонятно. даже я все уже понял.



jenya7
пришел ответ - вызвался updateRegReadValue - показал данные.
...отправил следующий запрос из очереди

спасибо. с очередью хорошо работает. но остается проблема - когда делаю int num = numbers.Dequeue(); - вопрос по какому индексу положить - listViewRead.Items[???].SubItems[1].Text = num .ToString("X"); - индексы уже убежали.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914436
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно в очередь класть не текст для отправки, а объект, содержащий как текст, так и нужный индекс.
Индекс можно запоминать в момент отправки и потом использовать после получения.

Но такой сценарий будет работать только в синхронной схеме, то есть когда есть только одна отправка и одно получение ответа и они не могут быть параллельны. Как я понимаю, у тебя именно так.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914440
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Возможно тебе поможет pipeline-паттерн .

очередь тоже прекрасно работает. даже если я все сделаю по книге - отдельные потоки, асинхронность - мы упираемся в ту же проблему - синхронизировать принятые пакеты с индексами в ГУИ (списке).
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914441
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Можно в очередь класть не текст для отправки, а объект, содержащий как текст, так и нужный индекс.
Индекс можно запоминать в момент отправки и потом использовать после получения.

Но такой сценарий будет работать только в синхронной схеме, то есть когда есть только одна отправка и одно получение ответа и они не могут быть параллельны. Как я понимаю, у тебя именно так.

прибор о наших индексах ничего не знает. я не могу добавлять отсебятину в протокол прибора. да у меня так - пакет отправил - получил ответ.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914445
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин...я конечно идиот. я возвращаю опкод и значение в регистре. а мог бы возвращать и адрес регистра. тогда бы знал по какому индексу прописать значение.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914451
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
прибор о наших индексах ничего не знает. я не могу добавлять отсебятину в протокол прибора. да у меня так - пакет отправил - получил ответ.
Я не это имел ввиду, я говорил о том, чтобы сохранять индекс в промежутке между запросом и ответом. Но раз есть путь лучше - хорошо.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914478
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
jenya7
прибор о наших индексах ничего не знает. я не могу добавлять отсебятину в протокол прибора. да у меня так - пакет отправил - получил ответ.
Я не это имел ввиду, я говорил о том, чтобы сохранять индекс в промежутке между запросом и ответом. Но раз есть путь лучше - хорошо.

а как сохранить в промежутке? если только сделать какой то лист, добавлять элемент с индексом, и засовывать в пустой элемент пришедшее значение. но если по какой либо причине будет пропуск в посылке или приеме - все сломается.
...
Рейтинг: 0 / 0
Out of range проблема.
    #39914486
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
а как сохранить в промежутке? если только сделать какой то лист, добавлять элемент с индексом, и засовывать в пустой элемент пришедшее значение. но если по какой либо причине будет пропуск в посылке или приеме - все сломается.
Зачем тут лист? Индекс сохраняется в экземплярной переменной класса, отвечающего за отправку/прием. Даже если произойдет сбой, при следующей отправке индекс обновится.

Но твой способ лучше конечно, я же не знал, какие у тебя там возможности обмена
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Out of range проблема.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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