события, многопоточность,...
От: Holms США  
Дата: 10.07.08 16:02
Оценка:
Есть,
приложение А (пА) — простое WinForms app.
приложение Б (пБ) — class library в котором есть некий класс который возбжудает некоторые события.
пА — подключенно к событиям пБ и модифицирует свои визуальные обьекты.
Всё работало хорошо пока пБ не стало многопоточным и теперь события выбрасываются из потока отличного от главного потока пА.
Ясно что теперь в пА в каждом обработчике события где изменяются визуальные контролы надо использовать BeginInvoke, и это прекрасно работает, но
пА настлько большое что займёт много времени что-бы найти все такие места и добавить нужный код.
Поэтому возник вопрос, как возбуждать события в пБ которые бы были в том же потоке что и главный поток пА.

пБ

public event OnTimestamp NewTimestamp;
public delegate void OnTimestamp(DateTime Stamp);
...
m_ddfClient.NewTimestamp += new Client.NewTimestampEventHandler(m_ddfClient_NewTimestamp); //это многопоточное событие, 3rd party object
...
void m_ddfClient_NewTimestamp(object sender, Client.NewTimestampEventArgs e)
{
  if (NewTimestamp != null) 
    NewTimestamp(e.Timestamp); //это наше событие, должно вызыватся в том же потоке что и главный поток пА
}

Как присоеденить пА и пБ что-бы наши события из пБ бы-ли как single-threaded?

Спасибо
The life is relative and reversible.
Re: события, многопоточность,...
От: KonstSK  
Дата: 10.07.08 16:36
Оценка: -1
Здравствуйте, Holms, Вы писали:

H>Есть,

H>приложение А (пА) — простое WinForms app.
H>приложение Б (пБ) — class library в котором есть некий класс который возбжудает некоторые события.
H>пА — подключенно к событиям пБ и модифицирует свои визуальные обьекты.
H>Всё работало хорошо пока пБ не стало многопоточным и теперь события выбрасываются из потока отличного от главного потока пА.
H>Ясно что теперь в пА в каждом обработчике события где изменяются визуальные контролы надо использовать BeginInvoke, и это прекрасно работает, но
H>пА настлько большое что займёт много времени что-бы найти все такие места и добавить нужный код.
H>Поэтому возник вопрос, как возбуждать события в пБ которые бы были в том же потоке что и главный поток пА.

H>пБ


H>
H>public event OnTimestamp NewTimestamp;
H>public delegate void OnTimestamp(DateTime Stamp);
H>...
H>m_ddfClient.NewTimestamp += new Client.NewTimestampEventHandler(m_ddfClient_NewTimestamp); //это многопоточное событие, 3rd party object
H>...
H>void m_ddfClient_NewTimestamp(object sender, Client.NewTimestampEventArgs e)
H>{
H>  if (NewTimestamp != null) 
H>    NewTimestamp(e.Timestamp); //это наше событие, должно вызыватся в том же потоке что и главный поток пА
H>}
H>

H>Как присоеденить пА и пБ что-бы наши события из пБ бы-ли как single-threaded?

в пБ можно передать ссылку на главную форму пА? наверное, тогда можно было бы в пБ проверять в UI-ном ли мы потоке и дергать события только в нем.
if (form.InvokeRequired)
{
form.Invoke (NewTimestamp, e.Timestamp);
}
else
{
NewTimestamp(e.Timestamp);
}
Re[2]: события, многопоточность,...
От: KonstSK  
Дата: 10.07.08 16:39
Оценка:
KSK>в пБ можно передать ссылку на главную форму пА? наверное, тогда можно было бы в пБ проверять в UI-ном ли мы потоке и дергать события только в нем.
KSK>if (form.InvokeRequired)
KSK>{
KSK> form.Invoke (NewTimestamp, e.Timestamp);
KSK>}
KSK>else
KSK>{
KSK> NewTimestamp(e.Timestamp);
KSK>}

Хотя, наверное, это не очень красивое решение..
Re: события, многопоточность,...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 17:10
Оценка:
Здравствуйте, Holms, Вы писали:

H>пА настлько большое что займёт много времени что-бы найти все такие места и добавить нужный код.


Я бы все же потратил это время. Заодно и обернул бы все такие места единым механизмом, чтобы конкретика синхронизации была ровно в одно месте.

H>Поэтому возник вопрос, как возбуждать события в пБ которые бы были в том же потоке что и главный поток пА.


В методе инициализации/запуска процесса, который инициирует пА и который выполняется в GUI потоке, создаешь экземпляр AsyncOperation, в дальнейшем события вызываешь через него.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: события, многопоточность,...
От: Holms США  
Дата: 10.07.08 18:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В методе инициализации/запуска процесса, который инициирует пА и который выполняется в GUI потоке, создаешь экземпляр AsyncOperation, в дальнейшем события вызываешь через него.


а можно про это поподробнее
пА это простое приложение WinForms
обьект из пБ, который возбуждает события, создатся так

Private WithEvents data As RTDataFeed.Connection
The life is relative and reversible.
Re[3]: события, многопоточность,...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 20:28
Оценка:
Здравствуйте, Holms, Вы писали:

H>а можно про это поподробнее


Можно. В описании класса AsyncOperationManager есть пример.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.