Здравствуйте, salvequick, Вы писали:
S>два потока..уведомить один о событии в другом. куда копать?
S>в первом потоке слушается сокет .... S>а во втором кторый владеет формой они (данные из него) отображаются на форме ....
S>как сообщить во второй что данные есть и можно начинать работу? S>куда копать ? S>посмотреть на event или на в какую сторону?
S>ничег не понимаю потому как на .Net ничего не делал ... первая прога S>после unix тяжеловато честно говоря... S>подскажите пожалуйста!!!
Смотрите в сторону наследников Waithandle, в частности ManulaResetEvent и AutoResetEvent.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: два потока..уведомить один о событии в другом. куда копа
Здравствуйте, salvequick, Вы писали:
S>два потока..уведомить один о событии в другом. куда копать?
S>в первом потоке слушается сокет .... S>а во втором кторый владеет формой они (данные из него) отображаются на форме ....
S>как сообщить во второй что данные есть и можно начинать работу? S>куда копать ? S>посмотреть на event или на в какую сторону?
S>ничег не понимаю потому как на .Net ничего не делал ... первая прога S>после unix тяжеловато честно говоря... S>подскажите пожалуйста!!!
в .НЕТ подобные вещи делаются на делегатах (delegate) и событиях (event). посмотреть пример в MSDN обязательно и полезно для начала =)
--------------------------
less think — do more
Re: два потока..уведомить один о событии в другом. куда копа
Идея такая, первый просто сигнализирует второму, что данные готовы для считывания,тогда второй производит считываение и скидывает после этого флаг.
Re: два потока..уведомить один о событии в другом. куда копа
От:
Аноним
Дата:
22.09.06 12:46
Оценка:
Здравствуйте, salvequick, Вы писали:
S>два потока..уведомить один о событии в другом. куда копать?
S>в первом потоке слушается сокет .... S>а во втором кторый владеет формой они (данные из него) отображаются на форме ....
S>как сообщить во второй что данные есть и можно начинать работу? S>куда копать ? S>посмотреть на event или на в какую сторону?
S>ничег не понимаю потому как на .Net ничего не делал ... первая прога S>после unix тяжеловато честно говоря... S>подскажите пожалуйста!!!
Один из вариантов — сделать обработчик события следующим образом
void example_DataHasCome(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler(example_DataHasCome), new object[] { sender, e });
return;
}
ProcessYourData();
}
Здесь this это форма, которая будет отображать данные.
Первый раз обработчик дернется из фонового потока получения данных, InvokeRequired будет true,
так как форма выполняется в другом потоке. BeginInvoke форсирует выполнения делегата обработчика в потоке,
в котором выполняется форма. Таким образом, при вызове этого метода из нити формы, InvokeRequired == false,
данные обработаются методом ProcessYourData().
Re: два потока..уведомить один о событии в другом. куда копа
Здравствуйте, salvequick, Вы писали:
S>Здравствуйте!
S>спасибо за советы!! S>попробую копнуть
Ну тебе тут и насоветовали
Смотри. Есть форма. В дизайнере вытаскиваешь на нее таймер, и в форме пишешь обработчик события таймера.
Так у тебя тоже самое, только вместо таймера твой код в потоке. Обяъви событие, а в форме сделай обработчика.
S>Ну тебе тут и насоветовали S>Смотри. Есть форма. В дизайнере вытаскиваешь на нее таймер, и в форме пишешь обработчик события таймера. S>Так у тебя тоже самое, только вместо таймера твой код в потоке. Обяъви событие, а в форме сделай обработчика.
вообщем это наиболее понятно мне пока из всего....
т.е в теории мне теперь все ясно
к потоку можно прикрутить свое событие?
и просто как tick по агалогии его ообработать
а как его вызвать? и как объявить его вот чего не могу понять....
у меня есть функция потока которая является членом класса формы ...
и я даже не представляю как добавить событие к ней и обратотчик в основной поток
примечик бы... их вроде и полно и статьи там всякие ... но у меня все равно все немного по другому
Re[4]: два потока..уведомить один о событии в другом. куда к
Здравствуйте, salvequick, Вы писали:
S>а как его вызвать? и как объявить его вот чего не могу понять.... S>у меня есть функция потока которая является членом класса формы ... S>и я даже не представляю как добавить событие к ней и обратотчик в основной поток
S>примечик бы... их вроде и полно и статьи там всякие ... но у меня все равно все немного по другому
дело в том что главнй поток не должен блокироваться...
иначе win сообщения не будут приниматься и форма как бы подвиснет...
поэтому блокировка на mutex или ManualResetEvent не подходит...
а создание делегата в котором идет вывод на экран и вызов его из потока приводит к тому что код по изменению данных
все ранво выполняется из потока а этого делать нельзя....
Здравствуйте, salvequick, Вы писали:
S>все равно не понятно
S>дело в том что главнй поток не должен блокироваться... S>иначе win сообщения не будут приниматься и форма как бы подвиснет... S>поэтому блокировка на mutex или ManualResetEvent не подходит...
S>а создание делегата в котором идет вывод на экран и вызов его из потока приводит к тому что код по изменению данных S>все ранво выполняется из потока а этого делать нельзя....
S>так что же остается то?
Остается Invoke()
Допустим сейчас у тебя так:
public void OnSocketDataReceived(object socketData)
{
// отображение полученных данных в форме
}
делаем так
public void OnSocketDataReceived(object socketData)
{
Invoke(new VisualUpdate(OnVisualUpdate), new object[]{socketData});
}
public delegate void VisualUpdate(object data);
public void OnVisualUpdate(object data)
{
// отображение полученных данных в форме
}
Здравствуйте, salvequick, Вы писали:
S>все равно не понятно
Самый дельный совет был (приведенный код долже выполняться в работающем с сокетом потоке):
===============
Один из вариантов — сделать обработчик события следующим образом
void example_DataHasCome(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler(example_DataHasCome), new object[] { sender, e });
return;
}
ProcessYourData();
}
Здесь this это форма, которая будет отображать данные.
Первый раз обработчик дернется из фонового потока получения данных, InvokeRequired будет true,
так как форма выполняется в другом потоке. BeginInvoke форсирует выполнения делегата обработчика в потоке,
в котором выполняется форма. Таким образом, при вызове этого метода из нити формы, InvokeRequired == false,
данные обработаются методом ProcessYourData().