Страница: 1 |
Страница: 1 |
Вопрос: Фундаментальный вопрос
Добавлено: 06.02.05 16:47
Автор вопроса: VisBas | Web-сайт:
Что будет с переменными и вообще нормально ли выполниться функция, если ее вызывают одновременно из нескольких мест.
Например имеем код вроде этого:
Private Sub Timer1_Timer()
Dim a As Long
Dim b As String
a = 4980
b = Podschitat(a)
End Sub
Private Sub Timer2_Timer()
Dim a As Long
Dim b As String
a = 480
b = Podschitat(a)
End Sub
Private Sub Timer3_Timer()
Dim a As Long
Dim b As String
a = 49806
b = Podschitat(a)
End Sub
Private Function Podschitat(p As Long) As String
Dim S As Integer
.
.
.
.
.
End Function
Все таймеры настроены на одно время и запущены одновременно.
Вопрос:
Не будут ли они (эти вызовы) друг другу мешать ?
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 06.02.05 17:26
нет небудут, хоть таймеры и запущены одновременно это не значит что они будут идти АБСОЛЮТНО одновременно, будет очередь таймеров Timer1_Timer Timer2_Timer Timer3_Timer... мне так кажется...
Номер ответа: 2
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #2
Добавлено: 06.02.05 18:31
А если время выполнения Podschitat настолько велико, что соизмеримо с периодом таймеров. Вызовы будут ждать освобождения ф-ии, или в памяти будут созданны ее копии(копии ф-ии)?
Номер ответа: 3
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #3
Добавлено: 06.02.05 18:35
Лично мне кажется что 1 вариант более реален, но может быть кто-то точно знает..?
Номер ответа: 4
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #4
Добавлено: 06.02.05 19:10
Простите, что рассуждаю тут сам с собой..
Если бы был 2 вариант, то вероятно были бы большие трудности с глобальными переменными используемыми в Podschitat.
Все же хочеться узнать точный ответ..
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 06.02.05 20:15
Попробуй
timer1.interval=10000
sleep 200
timer1.interval=10000
sub podschitat()
print "Started: " & cstr(timer)
sleep 10000
print "Finished: " & cstr(timer)
end sub
и напиши, что получилось, будет интересная информация для размышления. Имхо, если не написать в podschitat DoEvents, событие WM_TIMER просто не будет обработано до завершения podschitat и результат должен быть (относительно) примерно
started: 0
finished: 10000
started: 10001
finished: 20001
и т.п.
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 06.02.05 20:24
Понимаешь, ее никогда не будут вызывать одновременно из нескольких мест лишь по той причине что на VB создание многопотоковых приложений затруднено, если не сказать что практически невозможно... А из этого следует что все таймеры выполняясь в одном потоке и имея одну форму, поочередно отсылают ей сообщение WM_TIMER... Еще бы тебе не помешало знать о так называемой очереди сообщений, т.е. все сообщения, не требующие мгновенной реакции, ставятся в очередь...
Т.о. одновременно у тебя тут никогда и ничего не произойдет... Если же ты каким-то образом пользуешься неведомым компилятором то с пом. CreateThread ты-таки сможешь создать несколько потоков, и при одновременном обращении к одной и той же области памяти вполне вероятно что будет вызвана ошибка чтения/записи/доступа, так для этих случаев существуют спец. методы и АПИ, что позволяют дождаться пока некоторый объект/область памяти будут свободны от др. потоков...
Номер ответа: 7
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #7
Добавлено: 06.02.05 20:27
> событие WM_TIMER
С каких это пор Windows Messages называют событиями?
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 06.02.05 21:11
Как их только не называют Некоторые по аналогии с никсами - сигналами
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 06.02.05 21:49
Ну если их в оконной процедуре обработать и сделать что-то вроде RaiseEvent EV_TIMER, то почему-бы и нет
Номер ответа: 10
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #10
Добавлено: 06.02.05 22:17
Sharp я проделал эксперимент навроде того, что ты предложил, и пришел к выводу - в таких эксперементах Sleep пользоваться нельзя.
Sleep полностью останавливает все на форме таймеры, и др.
С одной стороны это является подтверждением того что все выполняется "по очереди", и программа ждет пока выполнится Sleep, но с другой стороны возможно это просто Sleep так действует.
Хочу подчеркнуть что Sleep останавливает все таймеры, даже никак не относящиеся к выполняемому в данный момент куску рограммы.
По поводу того что все выполняется в одном потоке, я тоже так думаю, но хотел получить доказательства.
Дело в том, что моя задача как раз написать многопотоковое приложение(ну или имитацию), одна ф-я будет вызываться из таймеров, таймеров несколько, и я просто боюсь, что вызовы будут мешать др. др.
Номер ответа: 11
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #11
Добавлено: 06.02.05 22:23
Хочу подчеркнуть что Sleep останавливает все таймеры, даже никак не относящиеся к выполняемому в данный момент куску рограммы.
Какая разница, Sleep были взяты только для того, чтобы нагляднее показать очередность событий, можешь использовать и циклы - приложение становится многопоточным только (?) если используешь DoEvents, иначе же все выполняется в одном потоке и события не обрабатываются, пока не завершатся выполняющиеся процедуры
Используй DLL, и пусть функция, которую ты из них вызываешь, создает тред, выполняющий основную работу, и завершается.
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 06.02.05 22:34
DoEvents не не создает никакой многопоточности, это скорее ближе к fiber чем к thread'ам...
Номер ответа: 13
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #13
Добавлено: 06.02.05 22:58
Я заменил Sleep на цикл, и ничего не изменилось..
Все действительно выполняется "по очереди", одним потоком.
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 06.02.05 22:58
ч.т.д.
Номер ответа: 15
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #15
Добавлено: 06.02.05 23:04
Спасибо sne, спасибо Sharp