Чем заменить Sleep?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Shurik90
Обычный пользователь
Обычный пользователь
 
Сообщения: 84
Зарегистрирован: 15.06.2003 (Вс) 23:49

Чем заменить Sleep?

Сообщение Shurik90 » 05.09.2004 (Вс) 7:33

Вот такой пример: надо запустить счетчик от 1 до 1000 и каждый раз, когда число кратно 100, счетчик должен останавливаться на 20 секунд, а затем бежать дальше.

Sleep я применить не могу, т.к. при его использовании форма зависает при 20 секундном простое, а это не допустимо.

Timer я тоже не могу использовать, т.к. не могу заставить счетчик остановиться и подождать пока пройдет время на таймере.

Помогите, пожалуйста, если кто то знает что мне делать.

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 05.09.2004 (Вс) 8:13

Почему не можешь?
из счетчика уходишь в таймер и по окончании 20 секунд возвращаешся к выполнению счетчика.

ToT
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 10.06.2002 (Пн) 11:56
Откуда: Russia, Taganrog

Сообщение ToT » 05.09.2004 (Вс) 9:45

Что значит не можешь остановиться и подождать? Вот код:
Код: Выделить всё
Private Declare Function QueryPerformanceCounter Lib "kernel32" _
    (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" _
    (lpFrequency As Currency) As Long

Public Function GetQueryPerf() As Double
Dim Freq As Currency
Dim tm As Currency

QueryPerformanceFrequency Freq
Freq = Freq * 10000
QueryPerformanceCounter tm
tm = tm * 10000
GetQueryPerf = tm / Freq
End Function

Public function Counter() as long
dim c as long
dim tm as double

For c=1 to 1000 '* главный счетчик.
  'что-то делаем...
  if (c mod 100)=0 then
      tm=GetQueryPerf
      do until GetQueryPerf-tm>20 '* тормозящий 20 секунд цикл.
        doevents '* теперь форма не виснет.
      loop
  end if
  'еще что-то делаем...
next c
End Function


GetQueryPerf показывает очень точное(гораздо точнее таймера) время с запуска винды.
Keyboard not found. Press any key.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.09.2004 (Вс) 12:13

Если особая точность не нужна, то схема такая:
Код: Выделить всё
For c = 1 To 1000 '* главный счетчик.
  'что-то делаем...
  If (c Mod 100) = 0 Then
      Timer1.Enabled = True
      While Timer1.Enabled '* тормозящий 20 секунд цикл.
        DoEvents '* теперь форма не виснет.
      Wend
  End If
  'еще что-то делаем...
Next c


Private Sub Timer1_Timer
    Timer1.Enabled = False
End Sub
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 05.09.2004 (Вс) 13:18

Попробуй
Код: Выделить всё
Private Declare Function SleepEx Lib "kernel32" (ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long
API-Guide писал(а):· dwMilliseconds
Specifies the time, in milliseconds, that the delay is to occur. A value of zero causes the function to return immediately. A value of INFINITE causes an infinite delay.

· bAlertable
Specifies whether the function may terminate early due to an I/O completion callback function or an APC. If bAlertable is FALSE, the function does not return until the time-out period has elapsed. If an I/O completion callback occurs, the function does not return and the I/O completion function is not executed. If an APC is queued to the thread, the function does not return and the APC function is not executed.
If bAlertable is TRUE and the thread that called this function is the same thread that called the extended I/O function (ReadFileEx or WriteFileEx), the function returns when either the time-out period has elapsed or when an I/O completion callback function occurs. If an I/O completion callback occurs, the I/O completion function is called. If an APC is queued to the thread (QueueUserAPC), the function returns when either the timer-out period has elapsed or when the APC function is called.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList