Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Как Усыпить действие на время.не через sleep. Vb6 Добавлено: 12.08.10 12:29  

Автор вопроса:  LEX1ERS | ICQ: 4204936 
Всем доброго дня. Хотел бы спросить как усыпить определеное действие на время, но в тоже время что бы программа была активна (допустим те же включенные таймеры) например:
If upload = true then
Усыпить процедуру или же if на - 3 секунды
Else
Усыпить на 10 секунд
End if
При этом мне не нужно использовать апи функцию sleep, ибо у меня находятся рабочие таймеры. Спасибо.

Ответить

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

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 12.08.10 14:18
С какой целью ты усыпляешь?

В VB6 весь код выполняется в потоке UI, поэтому любая попытка что-то усыпить усыпит все приложение.
Чтоб усыпить какой-то код на время, при этом не затрагивая поток UI, нужно использовать многопоточность (возможно в VB .NET, сложно в VB6).

Может тебе можно как-то обходным путем сделать? Например сделать цикл с усыплением на 50 мс и вызовом Application.DoEvents, и далее проверка, прошло время "сна" или нет, если не прошло, снова усыпляешь на 50 мс. Криво, но визуально будет выглядеть так буд-то приложение не зависло.

Ответить

Номер ответа: 2
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #2
Добавлено: 12.08.10 14:57
ну
  1. tm = Timer
  2. Do While (Timer - tm) < 5
  3.     DoEvents
  4. Loop
Где 5 - это время усыпления в секундах.
усыпит не трогая таймеры, но загружает при этом проц(или ядро) по полной.

Ответить

Номер ответа: 3
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #3
Добавлено: 12.08.10 15:15
Профит:
  1.  
  2. Function MySleep(timesleep as single)
  3. tm = Timer
  4. Do While (Timer - tm) < timesleep
  5.     DoEvents
  6.     Sleep 1
  7. Loop
  8. End Function


Усыпит не трогая таймеры и не загружая ядро.

Ответить

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



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #4
Добавлено: 12.08.10 17:56
:)

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 12.08.10 20:31
Не будет корректно работать если одновременно в нескольких местах захочет себя усыпить

Ответить

Номер ответа: 6
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #6
Добавлено: 12.08.10 22:21
Мдя. Без многопоточности тут сразу приходят в голову два выхода. Первый уже написан, по сути - слипы будут накладываться друг на друга и выбираться самый длинный слип. Второй вариант - каждый вызов MySleep во время выполнения другого MySleep добавляет время ожидания. Если вася запустил слип на 1 секунду и через полсекунды, недождавшись, запустил еще один слип на 2, то в итоге отклик будет через 2,5 секунды. Вот, собственно, слип.
  1.  
  2. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  3. Function MySleep(timesleep As Single)
  4. Dim h As Boolean
  5. 'Если ты не создаешь экземпляров своей формы, а тупо ее юзаешь, забивая на ООП, то так можно.
  6. Static tm As Single
  7. Static timing As Boolean
  8. If Not timing Then tm = Timer
  9. tm = tm + timesleep
  10. h = timing
  11. timing = True
  12. Do While Timer < tm
  13.     DoEvents
  14.     Sleep 1
  15. Loop
  16. timing = h
  17. End Function

Ответить

Номер ответа: 7
Автор ответа:
 Eugy



Вопросов: 0
Ответов: 73
 Профиль | | #7 Добавлено: 15.08.10 02:39
Timer с боем курантов обнулится и Do While зависнит на сутки:)

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 15.08.10 12:40
Мышки плакали, кололись, но продолжали грызть кактус

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #9 Добавлено: 15.08.10 13:07
:D

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 15.08.10 13:16
Мышки плакали, кололись, но продолжали грызть кактус

Это ты про многопоточность в VB6?
Нихрена не выходит обойтись без многопоточности но все равно пишут на VB6?

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 15.08.10 14:06
Да они вроде даже какую-то многопоточность за 13 лет умудрились смастерить, правда постоянно падает и отладчик глючит, но они все равно пруццо

Ответить

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



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #12 Добавлено: 15.08.10 16:33
:-D:-D:-D:-D:-D

Ответить

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



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #13
Добавлено: 16.08.10 20:30
в примерах есть пногопоточность...

Ответить

Номер ответа: 14
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #14
Добавлено: 16.08.10 21:32
Надо замутить прогу, генерирующую обертку всех неймспейсов фраемворка в один жирный класс для VB6. Тогда можно будет писать под фраемворк на VB6.
  1.  
  2. Dim rasta As New NETFramework
  3. Dim boo As Bitmap
  4. boo = rasta.System.Windows.Drawing.Bitmap.FromFile("Жрать.png")


Бо?

PS: Или кто-то это уже придумал?



:D

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 17.08.10 09:38
Go and be that man

Ответить

Страница: 1 | 2 |

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



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