Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Как избежать остановки таймера при нажатии на к... Добавлено: 11.01.04 13:46  

Автор вопроса:  katya

Например, во время работы программы работает таймер времени, который показывает, сколько времени осталось до завершения работы программы, но если пользователь нажимает и удерживает кнопку “закрыть”, при этом не выходя из программы (имеется в виду кнопка в правом верхнем углу формы), то таймер замораживается. Соответственно при возвращении в программу время уже неверное. Как можно избежать этого?
Чтоб таймер продолжал работать во время удерживания кнопки “закрыть”.

 Помогите, пожалуйста.

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Grayich



ICQ: 208280504 

Вопросов: 56
Ответов: 164
 Web-сайт: grayich.narod.ru
 Профиль | | #1
Добавлено: 11.01.04 13:50

Ну наверное через APi,  поищи по форуму тут это уже обсуждалось гдето. есть 2 вариант :)) , вычисляй время по системному времени, эти часы не так сильно тормозят :)) Или попробуй создать еще 1 форму невидимую, и размести таймер на ней, и запускай все это с модуля Main().  Мдя... а вообще через АПИ делай дето тут было, ищи :)

Ответить

Номер ответа: 2
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #2
Добавлено: 11.01.04 13:53

использовать gettickcount

допустим если прога должна завершиться через 1 мин то:

public start as long

....

start=gettickcount()

....

sub timer1_timer

label1.caption=60-(gettickcount-start)\1000

if ((gettickcount-start)\1000)>60 then end

end sub

примерно так

Ответить

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



Вопросов: 1
Ответов: 2
 Профиль | | #3 Добавлено: 11.01.04 20:33

Спасибо за ответы, но мне нужен таймер независимый от часов Windows.

Ввариант с другой формой и модулем работает только c использованием win-времени, но это понятно почему, а мне нужен таймер типа 15:00, где через 15 минут программа завершает работу, а если пользователь будет удерживать кнопку "закрыть" или кнопки свернуть/развернуть окно, то он может продлить себе время прибывания в программе, т.к  вся программа замораживается. Ваши варианты пробовала, но они не работают!

Помогити плз, очень надо!


 

 

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 11.01.04 21:40

А если использовать API таймера SetTimer, KillTimer ? Тоже не помогает ?

Ответить

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



Вопросов: 1
Ответов: 2
 Профиль | | #5 Добавлено: 11.01.04 23:08

Нет, использование API не помогает. Можете сами убедиться, вот пример:

Код модуля:

Option Explicit
Option Private Module
Private Declare Function SetTimer Lib "user32" (ByVal lngHandle As Long, ByVal lngEvent As Long, ByVal lngElapse As Long, ByVal lngFuncion As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal lngHandle As Long, ByVal lngEvent As Long) As Long
Private Sub Progress()
    frmMain.lblMsg = CLng(frmMain.lblMsg) + 1
End Sub
Public Sub CloseTimer(ByVal lngHandle As Long)
    KillTimer lngHandle, 0
End Sub
Public Sub StartTimer(ByVal lngHandle As Long, ByVal lngInterval As Long)
    SetTimer lngHandle, 0, lngInterval, AddressOf Progress
End Sub

Код формы:

Option Explicit
Private Sub cmdRun_Click()
    modTimer.StartTimer hWnd, 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
    modTimer.CloseTimer hWnd
End Sub

Ответить

Номер ответа: 6
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #6
Добавлено: 11.01.04 23:21

вот 100% работает, кинь на форму таймер и лейбл, независит от времени виндовс

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Public start As Long

Const max = 10000'здесь макс время в милисекундах

Private Sub Form_Load()

start = GetTickCount

End Sub

Function convert(t As Long) As String

t = t \ 1000

If t > 60 Then

convert = Str$(t \ 60) & ":" & con((t Mod 60))

End If

End Function

Function con(t As Long) As String

If Len(Trim$(Str$(t))) = 1 Then

con = "0" & t

Else

con = t

End If

End Function

Private Sub Timer1_Timer()

s = GetTickCount

If s - max < start Then

Label1.Caption = convert(max - (s - start))

Else

End

End If

End Sub

Ответить

Номер ответа: 7
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #7
Добавлено: 12.01.04 00:04

вот, замени ету функцию на эту:

Function convert(t As Long) As String

t = t \ 1000

If t > 60 Then

convert = Str$(t \ 60) & ":" & con((t Mod 60))

Else

convert = t

End If

End Function

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 16.01.04 06:45
При нажатии и удерживании кнопки [X], приложение съедает всё свободное
процессорное время и, видимо, приложение не обрабатывает приходящие
твоему окну сообщения таймера. Как это порешить, не используя
системное время, я не знаю..

Как вариант, время отсчитывать в отдельном потоке, записывать в
какую-нть переменную, а эта форма пусть по таймеру читает по таймеру
данные из этой переменной.
Только вот многопоточность в VB6 не рулит :(

Ответить

Страница: 1 |

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



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