Windows Service – вместе с .Net
От: aivanov  
Дата: 26.03.03 09:06
Оценка:
Помогите начинающему программисту

Два вопроса:

1. Программа работает как Windows Service представляет собой бесконечный цикл.
Умудряюсь запустить этот цикл таким образом

Protected Overrides Sub OnStart(ByVal args() As String)
Timer1.False
...
bAbort = False ' Выход из цикла
...
Timer1.Interval = 2000
Timer1.True
End Sub

Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed

Timer1.False
Poll()

End Sub


Private Sub Poll()
...

Do While (bAbort = False)
... ' Основная часть программы
Loop
...
End Sub

Protected Overrides Sub OnStop()
bAbort = False
...
End Sub

Если я использовал процедуру Poll() в Windows приложении то выход из цикла по bAbort работает нормально, когда как написано выше то сервис нормально не останавливается.

Вопрос как организовать Windows Service — основная часть программы это бесконечный цикл.
Как этот цикл запустить с помощью OnStart и остановить с помощью OnStop

2. Есть ли в Windows Service аналог Application.DoEvents()

Проблема: программа работает с определенными устройствами через сеть. Я использую функции из DLL производителя устройств.

В фазе между инициализацией устройств и нормальной работой нужно сделать паузу около 2 сек.
System.Threading.Thread.Sleep(2000) – не помогает.

В Windows приложении я использовал Timer + Application.DoEvents() и все работало нормально.

Чем заменить Application.DoEvents() в Windows Service
Re: Windows Service – вместе с .Net
От: Аноним  
Дата: 26.03.03 09:27
Оценка:
Здравствуйте, aivanov, Вы писали:

A>Чем заменить Application.DoEvents() в Windows Service


лучше заменить System.Timer (GUI компонент) на System.Threading.Timer
тогда никаких DoEvents не потребуется
Re: Windows Service – вместе с .Net
От: mihailik Украина  
Дата: 27.03.03 14:10
Оценка:
A>В фазе между инициализацией устройств и нормальной работой нужно сделать паузу около 2 сек.
A>System.Threading.Thread.Sleep(2000) – не помогает.


Как так "не помогает"?

Вообще непонятно, зачем тебе таймер? Сделай просто бесконечный цикл, и прямо в нём отрабатывай "основную часть программы".
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Windows Service – вместе с .Net
От: Аноним  
Дата: 27.03.03 19:52
Оценка:
Здравствуйте, mihailik, Вы писали:

A>>В фазе между инициализацией устройств и нормальной работой нужно сделать паузу около 2 A>>System.Threading.Thread.Sleep(2000) – не помогает.


M>Как так "не помогает"? 1


M>Вообще непонятно, зачем тебе таймер? Сделай просто бесконечный цикл, и прямо в нём отрабатывай "основную часть программы". 2.


1. Не помогает. Не могу понять почему. Я вызываю функцию из DLL для инициализаци устройств
(Терминал — работает под TCP) я так понимаю это что-то похоже на Connect.
Если я кручу в цикле 2 сек. Application.DoEvent то далее все нормально работает. Если использую Sleep(2000) то нет. А у Windows Service нет Application.DoEvent ...
2. Я сделал бесконечный цыкл но как его запустить из OnStart (Windows Service). Я умудрился только через Timer. Если есть другой способ поскажите.
Re[3]: Windows Service – вместе с .Net
От: mihailik Украина  
Дата: 31.03.03 06:59
Оценка:
M>>Как так "не помогает"? 1

А>1. Не помогает. Не могу понять почему. Я вызываю функцию из DLL для инициализаци устройств

А>(Терминал — работает под TCP) я так понимаю это что-то похоже на Connect.
А>Если я кручу в цикле 2 сек. Application.DoEvent то далее все нормально работает. Если использую Sleep(2000) то нет. А у Windows Service нет Application.DoEvent ...

Видимо, эта DLL использует-таки очередь сообщений Windows для своих подспудных целей. В этом случае, по-моему, нет другого выхода, как прокачивать события на низком уровне.

При инициализации стандартной дотнетовской очереди сообщений под сервисом вылетает ошибка: там зачем-то стоит проверка UserInteractive.

А>2. Я сделал бесконечный цыкл но как его запустить из OnStart (Windows Service). Я умудрился только через Timer. Если есть другой способ поскажите.


Можно запустить отдельный поток, System.Threading.Thread, или воспользоваться асинхронными делегатами. А у тебя вообще Poll вызывается?
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.