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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непоятка с потоками 
:(
    Опции темы
Demokratizator
Дата 16.5.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



добрый день.
создается новый поток и в нем запускается функция расчета. новый поток запускается в другой (_progressForm) форме и надо менять свойство основной формы из этого потака
вот код:

Код

//создается _progressForm форма:

this._progressForm = new ProgressForm () ;
 _threadGenerateAndShow = 
        new Thread ( new ThreadStart ( this.GenerateReportsAsync ) ) ;

this._progressForm.AsyncOperationThread =
    _threadGenerateAndShow ;

this._progressForm.ShowDialog () ;

.........................

//Функция другого потоке
private void GenerateReportsAsync ()
{
  try
  {                
    foreach ( CheckBox chk in this._checkBoxList )
    {
    ReportPanel pnl = chk.Tag as ReportPanel ;
//Тут выскакивает исключение типа: Cross-thread operation not valid: 
//Control 'frmMain' accessed from a thread other than the thread it was created on.
    pnl.Enable = false;
    }
}



функция _progressForm формы:

Код

private void ProgressForm_Load(object sender, System.EventArgs e)
{
     if (null != this.AsyncOperationThread)
            this.AsyncOperationThread.Start();
}





добавил делегат и соответсвенно вызов изменился:

Код

//добавил следующее:
public delegate void SetEnableDelegate(ReportPanel _pnl, bool _value);

private void SetEnable(ReportPanel _pnl, bool _value)
{
    _pnl.Invoke(new SetEnableDelegate(this.ToDo), new object[] { _pnl, _value });
}

private void ToDo(ReportPanel tPnl, bool tValue)
{
    tPnl.Enabled =  tValue;
}

//Функция другого потоке
private void GenerateReportsAsync ()
{
  try
  {                
    foreach ( CheckBox chk in this._checkBoxList )
    {
    ReportPanel pnl = chk.Tag as ReportPanel ;
        this.SetEnable(pnl, false);
    }
}




но всеравно выскакивает исключение... в чем трабла?
в 2003 студии все работало, переделал проект в 2005 - в дебаг режиме вылетает исключение, если просто екзешник запускать - то все оК.
PM MAIL   Вверх
adLucem
Дата 16.5.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



Demokratizator, проблема в том, что оперировать компонентами Windows.Forms можно только в том потоке, в котором они были созданы.

Обращения к компонентам Windows.Forms ведут к нестабильной работе. В Debug режиме в этом случае всегда генерируется исключение, а при обычном запуске только в случае краха компонента.

Используйте свойство InvokeRequired и функции Invoke или BeginInvoke для передачи управления в поток, в котором был создан компонент Windows.Forms.

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

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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