Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Паралельное выполнение эвентов  (Прочитано 17790 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
mixa
Гость
« : 22-10-2003 19:56 » 

Вот такое у меня закралось сомнение. Есть у меня на форме 2 таймера, которые срабатывают каждый в свое время. Иногда может случиться так, что они вызовутся в одно время. Вернее второй эвент вызовется, когда первый будет еще работать. Есть необходимость использовать объекты синхронизации, или все эвенты обрабатываются последовательно, одной функцией обаботки окна один за одним?

Два таймера это еще ничего, это я для примера дал. На самом деле у меня 6 сокетов и таймер. Одна пара для посылки файла через фтп, вторая пара для получения файла и еще одна для всяких разных задач выполняемых по таймеру- типа обновление списков, создания директорий. И все это должно работать одновременно.
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-10-2003 04:30 » new

В книге не читал но по результатом тестов ...

Единовременно выполняется только одно событие ему передается управляющая нить и по этой причяине во время его выполнения других событий возникнуть не может .
Тестовая программа
Цитата

Public D As Integer

Private Sub Command1_Click()
MsgBox Str(D)
End Sub

Private Sub Timer1_Timer()
D = D + 1
End Sub

На форме кнопка и таймер с тактом в одну секунду.

MsgBox  блокирует окно вместе с таймером и сколько бы он не висел на экране счет бдет продолжен только после его закрытия.
Записан

Да да нет нет все остальное от лукавого.
mixa
Гость
« Ответ #2 : 23-10-2003 14:37 » 

Спасибо за поддержку.

Цитата: PSD
В книге не читал но по результатом тестов ...


Такой тест, я конечно самым первым делом написал. даже немного не так. Я по кнопке делал цикл ожидания, на пару секунд. Потому что не понятно как этот самый MsgBox обрабатывает сообщения.

Код:

TimeOut = 5
start = Timer
   
While )Timer - start < TimeOut:
        DoEvents
wend


Так вот когда есть этот самый DoEvents (отдать такт управления виндовсу), то счетчики продолжают работать, а если нет - то нет. Следовательно не так уж и последовательно вызываются эти эвенты. Просто мы им не даем вызываться параллельно. Конечно до мютексов и семафоров дело не дойдет - но все-таки. Но это таймер, а может с сокетами все по другому ? Так что хотелось бы с книжкой это проверить.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 23-10-2003 16:57 » 

Цитата

Конечно до мютексов и семафоров дело не дойдет - но все-таки.

Это не совсем то.
Мютекс и семафор - это как раз тот же MessageBox по сути.
Вызывает задержку второго потока, или обработчика - пока первый не отбежал свое.
Записан

А птичку нашу прошу не обижать!!!
mixa
Гость
« Ответ #4 : 25-10-2003 10:07 » 

Цитата: Гром
Цитата

Конечно до мютексов и семафоров дело не дойдет - но все-таки.

Это не совсем то.
Мютекс и семафор - это как раз тот же MessageBox по сути.
Вызывает задержку второго потока, или обработчика - пока первый не отбежал свое.


А, брат, это зависит от степени модальности месажбокса  Отлично
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 27-10-2003 05:30 » 

Цитата

DoEvents

DoEvents мы  сами явно приказываем среде продолжить обработку событий.
Поток один и самовольно бейсик ничего такого делать не будет.

Точкой разрыва нити всегда будет DoEvents.
Можно утверждать что обработчик не содержащий в своем коде
DoEvents будет выполнен целиком без переключения.

Тоже можно сказать и о обработчике с DoEvents с той разницей что в точке помеченой DoEvents вероятно будет выполнен обработчик другого события.

Точку разрыва нити ты знаешь(DoEvents)  остается только коректно ее обработать.
Записан

Да да нет нет все остальное от лукавого.
Миша
Гость
« Ответ #6 : 27-10-2003 07:47 » 

Подожди подожди дорогой товарищ PSD.
Вот ты то мне и нужен. Значит как получается. Произошело событие, взывался обработчик, начал работать и крутиться, пока крутится вызывает DoEvent. Тут пришело другое событие и стало в очередь. На очередном DoEvent мы вынули из очереди пришедшие событие и начали крутить новый обработчик. А старый типа стоит молча в сторонке и ждет ? А если в этот момент прийдет еще одно событие - то уже 2 обработчика будут стоять в сторонке ?
в общем если я между 2 операторами не вызову DoEvent, то можно вполне сказать, что ничего другого и не вызовется.
Код:
if gintNumItes > 5 Then
    gintNumItems = gintNumItems + 1
endif
То есть значение переменной gintNumItes между первой и втрой строчкой не изменятся ?
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 27-10-2003 08:27 » 

Не должно.
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 13-04-2006 17:05 » 

Оставить
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines