Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов делегата из потока  (Прочитано 4555 раз)
0 Пользователей и 1 Гость смотрят эту тему.
h.m.f.
Участник

ru
Offline Offline
Пол: Мужской

« : 17-08-2006 05:03 » 

Есть такой код:
Код:
public delegate void delegateFillCustomDG(ref EveryDayReport.Custom[] custom);

private void btnAutoReport_Click(object sender, System.EventArgs e)
{
Thread threadAutoReport=new Thread(new hreadStart(AutoReport_Async));
threadAutoReport.Start();
}

private void AutoReport_Async()
{
Custom[] custom=null;
... // заполнение структуры Custom[]
if(Custom!=null)
{
 delegateFillCustomDG fillCustomDG=new elegateFillCustomDG(FillCustomTable);
 this.Invoke(fillCustomDG,new object[] {Custom});
}
}

при вызове метода Invoke() иногда возникает исключение (а иногда и не возникает):
An unhandled exception of type 'System.ArgumentException' occurred in system.windows.forms.dll
exception   {"'0' не является допустимым значением 'value'. Значение 'value' должно быть в диапазоне от 'minimum' до 'maximum'." }   System.ArgumentException

Подскажите в чем может быть дело?
« Последнее редактирование: 06-12-2007 19:41 от Алексей1153++ » Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 17-08-2006 07:12 » 

А на какой строке это нулевое значение, там должно быть написано.
Да и код лучше весь опубликуй
Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 17-08-2006 08:04 » 

По схеме:
- кликается мышой на кнопку, что вызывает btnAutoReport_Click;
- btnAutoReport_Click создаёт нить, тело которой есть метод AutoReport_Async, и запускает нить;
- нить с помощью Invoke вызывает в исходной нити метод FillCustomTable.

Очевидно, что ошибка возникает в этом методе, код которого не опубликован. И даже, полагаю, дело не только в методе, но и в тех полях объекта, с которыми этот метод прямо или косвенно работает. В частности, ошибка может быть в том как и когда заполняется структура Custom.

Скорее всего где-то отсутствует синхронизация нитей.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
h.m.f.
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 17-08-2006 11:27 » 

в FillCustomTable определяется только стиль DataGrid и заполняется DataTable переданным массивом структура Custom[]:
Код:
private void FillCustomTable(ref EveryDayReport.Custom[] custom)
{
DataGridTableStyle dgtCustomStyle=new DataGridTableStyle();
dgtCustomStyle.MappingName="Заказы";
dgtCustomStyle.AlternatingBackColor=Color.LightBlue;

DataGridColumnStyle ColNumber=new DataGridTextBoxColumn();
ColNumber.MappingName="Порядковый номер";
ColNumber.HeaderText="Порядковый номер";
ColNumber.ReadOnly=true;
ColNumber.Width=20;
dgtCustomStyle.GridColumnStyles.Add(ColNumber);

DataGridColumnStyle ColCheck=new DataGridBoolColumn();
ColCheck.MappingName="Учитывать заказ в отчете";
ColCheck.HeaderText="Учитывать заказ  в отчете";
((DataGridBoolColumn)ColCheck).AllowNull=false;
((DataGridBoolColumn)ColCheck).TrueValue="true";
((DataGridBoolColumn)ColCheck).FalseValue="false";
ColCheck.ReadOnly=false;
ColCheck.Width=20;
dgtCustomStyle.GridColumnStyles.Add(ColCheck);

DataGridColumnStyle ColName=new DataGridTextBoxColumn();
ColName.MappingName="Имя заказа";
ColName.HeaderText="Имя заказа";               
ColName.ReadOnly=true;
ColName.Width=50;
dgtCustomStyle.GridColumnStyles.Add(ColName);

DataGridColumnStyle ColDate=new DataGridTextBoxColumn();
ColDate.MappingName="Дата создания";
ColDate.HeaderText="Дата создания";
ColDate.ReadOnly=true;
ColDate.Width=80;
dgtCustomStyle.GridColumnStyles.Add(ColDate);

DataGridColumnStyle ColPrice=new DataGridTextBoxColumn();
ColPrice.MappingName="Сумма в ценах каталога";
ColPrice.HeaderText="Сумма в ценах каталога";
ColPrice.ReadOnly=true;
ColPrice.Width=80;
dgtCustomStyle.GridColumnStyles.Add(ColPrice);

DataGridColumnStyle ColPosCount=new DataGridTextBoxColumn();
ColPosCount.MappingName="Позиций в заказе";
ColPosCount.HeaderText="Позиций в заказе";
ColPosCount.ReadOnly=true;
ColPosCount.Width=80;
dgtCustomStyle.GridColumnStyles.Add(ColPosCount);

DataGridColumnStyle ColSkladPosCount=new DataGridTextBoxColumn();
ColSkladPosCount.MappingName="Складских позиций в заказе";
ColSkladPosCount.HeaderText="Складских позиций в заказе";
ColSkladPosCount.ReadOnly=true;
ColSkladPosCount.Width=80;
dgtCustomStyle.GridColumnStyles.Add(ColSkladPosCount);

DataTable dt=new DataTable("Заказы");
dt.Clear();

DataColumn dc;
DataRow dr;

dc=new DataColumn();
dc.ColumnName="Порядковый номер";
dc.ReadOnly=true;
dc.AutoIncrement = true;   
dc.AutoIncrementSeed=1;
dc.AutoIncrementStep=1;
dt.Columns.Add(dc);     

dc=new DataColumn();
dc.ColumnName="Учитывать заказ в отчете";
dc.ReadOnly=false;
dt.Columns.Add(dc);

dc=new DataColumn();
dc.ColumnName="Имя заказа";
dc.ReadOnly=true;
dt.Columns.Add(dc);

dc=new DataColumn();
dc.ColumnName="Дата создания";
dc.ReadOnly=true;
dt.Columns.Add(dc);

dc=new DataColumn();
dc.ColumnName="Сумма в ценах каталога";
dc.ReadOnly=true;
dt.Columns.Add(dc);

dc=new DataColumn();
dc.ColumnName="Складских позиций в заказе";
dc.ReadOnly=true;
dt.Columns.Add(dc);

dc=new DataColumn();
dc.ColumnName="Позиций в заказе";
dc.ReadOnly=true;
dt.Columns.Add(dc);     


for(int i=0;i<custom.Length;i++)
{
dr=dt.NewRow();
if(custom[i].SkladType==DSL.Elements.CusInvType.Sklad)
{
dr["Учитывать заказ в отчете"]="true";
}
else
{
dr["Учитывать заказ в отчете"]="false";
}
dr["Имя заказа"]=custom[i].Name;
dr["Дата создания"]=custom[i].DateCreate.ToString(Extender.DateTimeExtended.MySQLDateFormat);
dr["Сумма в ценах каталога"]=custom[i].Summ.ToString("f");
dr["Складских позиций в заказе"]=custom[i].SkladPosCount;
dr["Позиций в заказе"]=custom[i].TotalPosCount;
dt.Rows.Add(dr);
}
dgCustom.TableStyles.Clear();
dgCustom.DataSource=dt.DefaultView;
dgCustom.TableStyles.Add(dgtCustomStyle);
}


Вот такая вот лабуда...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 17-08-2006 12:48 » 

лабуда
Цитата: h.m.f
in system.windows.forms.dll

Следовательно, ошибка в контролах формы. Контрол у тебя один - DataGrid dgCustom. Смотри, что происходит с dgCustom одновременно в разных нитях. И внимательно читай в MSDN секции "Thread Safety" для разных методов и свойств, которыми ты пользуешься.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
h.m.f.
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-08-2006 03:50 » 

Спасибо всем кто поучавствовал. Проблема была в том что с другой формы (при смене значения radiobutton) вызывался метод, который обращался к этому DGcustom.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines