| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
| [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} );
 
 }
 }
 
 Спасибо.
 |  
 
 
 |  |