Страница: 1 |
Страница: 1 |
Вопрос: Останов цикла
Добавлено: 25.08.05 13:41
Автор вопроса: LamerOnLine | ICQ: 334781088
Вопрос: Есть основной цикл программы, внутри него проверяется определенное условие, если оно истинно - нужно приостановить работу цикла, но так чтобы меть возможность отрабатывать внешние события.
Конкретнее - приложение ActiveX.exe, оно многопоточно в принципе, отработка событий ведется параллельно с работой главного цикла.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #1
Добавлено: 25.08.05 14:16
А Exit Do или Exit For нельзя? Выйдешь из цикла, а когда надо запустишь.
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 25.08.05 18:26
) Можно в него вставить еще один цикл с DoEvents... А вообще если многопоточное все это дело, то Sleep должен тормознуть будет-лишь 1 поток, остальные будут работать...
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 26.08.05 13:34
Exit For не катит по простой причине - придется перестраивать всю логику работы приложения. Геморно.
DoEvents в активиксах работает ОЧЕНЬ нестабильно. Проще говоря, никакой гарантии что поток вообще из DoEvents вернется.
Дело то многопоточное, и Sleep как раз тормозит один поток, но остальные 10 до него достучаться не могут. Не реагирует он на события.
Тут такая тема - работает шлюз, один поток - парсер, 10 - сервер-укладчики.
Парсер, определяя что процесс использует слишком много памяти должен приостановиться, но продолжать выдавать данные укладчикам, и те, по мере сохранения, освобождают память. Но вот Sleep тормозит весь поток парсера. Лага в общем.
Номер ответа: 4
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #4
Добавлено: 26.08.05 18:29
может таймером тормозить?
Private Sub Command1_Click()
Static c
If Timer1.Enabled = True Then c = c + 1: Timer1.Enabled = False
For i = c To 100
c = i
List1.AddItem i
If i = 50 Then 'условие
Timer1.Enabled = True: Exit For
End If
Next i
End Sub
Private Sub Timer1_Timer() 'Определённый интервал
Command1_Click
End Sub
Номер ответа: 5
Автор ответа:
vhash
Вопросов: 7
Ответов: 14
Профиль | | #5
Добавлено: 27.08.05 19:52
Dim uslovie
Do While uslovie
DoEvents
WaitMessage
Loop
WaitMessage - ожидает сообщение в процесс, а пока его нет приостанавливает его.
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 29.08.05 12:09
WaitMessage саспендит поток а не процесс. Иначе на кой бы она тут
А вот с DoEvents, как я уже говорил, связываться не хочется - глюкавит частенько. Не могу я себе позволить такой роскоши