Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос:  Фундаментальный вопрос Добавлено: 06.02.05 16:47  

Автор вопроса:  VisBas | Web-сайт: chipmicro.narod.ru
Что будет с переменными и вообще нормально ли выполниться функция, если ее вызывают одновременно из нескольких мест.
Например имеем код вроде этого:

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-сайт: chipmicro.narod.ru
 Профиль | | #2
Добавлено: 06.02.05 18:31
А если время выполнения Podschitat настолько велико, что соизмеримо с периодом таймеров. Вызовы будут ждать освобождения ф-ии, или в памяти будут созданны ее копии(копии ф-ии)?

Ответить

Номер ответа: 3
Автор ответа:
 VisBas



Вопросов: 44
Ответов: 127
 Web-сайт: chipmicro.narod.ru
 Профиль | | #3
Добавлено: 06.02.05 18:35
Лично мне кажется что 1 вариант более реален, но может быть кто-то точно знает..?

Ответить

Номер ответа: 4
Автор ответа:
 VisBas



Вопросов: 44
Ответов: 127
 Web-сайт: chipmicro.narod.ru
 Профиль | | #4
Добавлено: 06.02.05 19:10
Простите, что рассуждаю тут сам с собой..

Если бы был 2 вариант, то вероятно были бы большие трудности с глобальными переменными используемыми в Podschitat.

Все же хочеться узнать точный ответ..

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 06.02.05 20:24
Понимаешь, ее никогда не будут вызывать одновременно из нескольких мест лишь по той причине что на VB создание многопотоковых приложений затруднено, если не сказать что практически невозможно... А из этого следует что все таймеры выполняясь в одном потоке и имея одну форму, поочередно отсылают ей сообщение WM_TIMER... Еще бы тебе не помешало знать о так называемой очереди сообщений, т.е. все сообщения, не требующие мгновенной реакции, ставятся в очередь...

Т.о. одновременно у тебя тут никогда и ничего не произойдет... Если же ты каким-то образом пользуешься неведомым компилятором :) то с пом. CreateThread ты-таки сможешь создать несколько потоков, и при одновременном обращении к одной и той же области памяти вполне вероятно что будет вызвана ошибка чтения/записи/доступа, так для этих случаев существуют спец. методы и АПИ, что позволяют дождаться пока некоторый объект/область памяти будут свободны от др. потоков...

Ответить

Номер ответа: 7
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #7
Добавлено: 06.02.05 20:27
> событие WM_TIMER
С каких это пор Windows Messages называют событиями? :)

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 06.02.05 21:11
Как их только не называют :) Некоторые по аналогии с никсами - сигналами :)

Ответить

Номер ответа: 9
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 06.02.05 21:49
Ну если их в оконной процедуре обработать и сделать что-то вроде RaiseEvent EV_TIMER, то почему-бы и нет ;)

Ответить

Номер ответа: 10
Автор ответа:
 VisBas



Вопросов: 44
Ответов: 127
 Web-сайт: chipmicro.narod.ru
 Профиль | | #10
Добавлено: 06.02.05 22:17
Sharp я проделал эксперимент навроде того, что ты предложил, и пришел к выводу - в таких эксперементах Sleep пользоваться нельзя.
Sleep полностью останавливает все на форме таймеры, и др.
С одной стороны это является подтверждением того что все выполняется "по очереди", и программа ждет пока выполнится Sleep, но с другой стороны возможно это просто Sleep так действует.
Хочу подчеркнуть что Sleep останавливает все таймеры, даже никак не относящиеся к выполняемому в данный момент куску рограммы.

По поводу того что все выполняется в одном потоке, я тоже так думаю, но хотел получить доказательства.
Дело в том, что моя задача как раз написать многопотоковое приложение(ну или имитацию), одна ф-я будет вызываться из таймеров, таймеров несколько, и я просто боюсь, что вызовы будут мешать др. др.

Ответить

Номер ответа: 11
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #11
Добавлено: 06.02.05 22:23
С одной стороны это является подтверждением того что все выполняется "по очереди", и программа ждет пока выполнится Sleep, но с другой стороны возможно это просто Sleep так действует.
 Хочу подчеркнуть что Sleep останавливает все таймеры, даже никак не относящиеся к выполняемому в данный момент куску рограммы.

Какая разница, Sleep были взяты только для того, чтобы нагляднее показать очередность событий, можешь использовать и циклы - приложение становится многопоточным только (?) если используешь DoEvents, иначе же все выполняется в одном потоке и события не обрабатываются, пока не завершатся выполняющиеся процедуры
Дело в том, что моя задача как раз написать многопотоковое приложение(ну или имитацию)

Используй DLL, и пусть функция, которую ты из них вызываешь, создает тред, выполняющий основную работу, и завершается.

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 06.02.05 22:34
DoEvents не не создает никакой многопоточности, это скорее ближе к fiber чем к thread'ам...

Ответить

Номер ответа: 13
Автор ответа:
 VisBas



Вопросов: 44
Ответов: 127
 Web-сайт: chipmicro.narod.ru
 Профиль | | #13
Добавлено: 06.02.05 22:58
Я заменил Sleep на цикл, и ничего не изменилось..
Все действительно выполняется "по очереди", одним потоком.

Ответить

Номер ответа: 14
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #14
Добавлено: 06.02.05 22:58
ч.т.д.

Ответить

Номер ответа: 15
Автор ответа:
 VisBas



Вопросов: 44
Ответов: 127
 Web-сайт: chipmicro.narod.ru
 Профиль | | #15
Добавлено: 06.02.05 23:04
Спасибо sne, спасибо Sharp

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам