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