информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяАтака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Net] Управление C# GUI-ями из I/O- потока. 28.12.05 04:53  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
Несложная задача, которая концептуально выглядит следующим способом:
Из «первичного» потока GUI – приложения C# создаётся поток (ioThread), который отправляет данные. Поток ioThread «шлёт проценты» выполнения io-задачи GUI. Последний отображает этот процесс в одном из своих окон (например, неком ProgressBar).

Некоторое сомнение связано с тем, что для того, чтобы «послать проценты», одна из функций ioThread вызывает public метод (пусть, showProgress( long bytesOut) ) GUI объекта, который и создал ioThread .


GUIobject -> > Create ioThread ->> loop … GUIobject.showProgress( bytesOut) … endloop & exit ioThread .


При посылке «процентов», showProgress ( bytesOut) не изменяет общих данных потоков, что могло бы привести к их десинхронизации. В принципе, особых сомнений нет (возможно от недостаточности знания предмета), но может всё же делать приостановку ioThread после вызова GUIobject.showProgress( bytesOut); Thread.Sleep(10), или вообще посылать (SendMessage) сообщение окну GUI.

В общем, работать–то работает. А, может, делает вид, что работает?

Спасибо за советы и мнение.

ПС. С наступающим Новым Годом, братцы. Всем большой зарплаты и радости в новом году.
"Обернул" вызовы методов оформ вызвами их же делегатов... 29.12.05 06:45  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
"Обернул" вызовы методов оформ вызвами их же делегатов....

Наверное, так по-правильному (следует из публикаций в инет). Но всё равно остаётся червоточина... Положим, если из вторичного потока только читаются или изменяются переменные-члены класса окна ( типа string m_tmp; int m_count и т.д.), которые заведомо не ответствены за перерисовку окна, или заведомо не могут быть изменены из двух потоков "одновременно". Не пойму, зачем MS рекомендует использовать асинхронные вызовы??? Ведь и так работает. И по логике вещей должно работать, ибо нет таких данных, к которым оба потока могут обратиться, нарушив синхронизацию.

delegate void ShowProgressInfoDelegat( int bytesSent );
public void ShowProgressInfo( int bytesSent )
{
if ( progressBarSending.InvokeRequired == false )
{

if ( bytesSent >= progressBarSending.Maximum)
{
progressBarSending.Maximum = bytesSent + (int )(((float)bytesSent )* 1.2 );
}

progressBarSending.Value = bytesSent;


frmMain frm = (frmMain)FindForm();
frm.SetFileSendingInfo( m_curSendingFile, bytesSent );
}
else
{

ShowProgressInfoDelegat progressBarDelegate = new ShowProgressInfoDelegat( ShowProgressInfo );
this.BeginInvoke( progressBarDelegate, new object[] { bytesSent} );

}
}

Спасибо.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach