Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

аналог GetSystemTime() в VB есть ?

2.2K
20 января 2004 года
VBuser
25 / / 05.09.2003
так что бы можно было получить системное время с точностью до одной милисекунды?
266
20 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
так что бы можно было получить системное время с точностью до одной милисекунды?


Примерно так (за 100% синтаксис не ручаюсь - если что, посмотришь по справке):
Dim Tm as Date
Dim Tm1 as Date
Dim Ms as Long

Tm = Format(Date, "dd.mm.yyyy hh.mm.ss.ms") 'МАХ получит дату со временем
Tm1 = Format(Time, "hh.mm.ss.ms") 'МАХ получит только время
Ms = CLng(Format(Time, "MS")) 'МАХ получит только милисекунды

2.2K
20 января 2004 года
VBuser
25 / / 05.09.2003
Tm1 = Format(Time, "hh.mm.ss.ms") 'МАХ получит

ругается на формат, скорее всего "ms", т.к. такого вроде нет по справке,
и что значит "MAX получит" ?
266
20 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
Tm1 = Format(Time, "hh.mm.ss.ms") 'МАХ получит

ругается на формат, скорее всего "ms", т.к. такого вроде нет по справке,
и что значит "MAX получит" ?


MAX получит - это ремарка. (В Basic ремарки начинаются с Rem, а в VB можно и Rem, и символ ' использовать. Т.е. всё, что после ' идёт в строке, VB проигнорирует).
По поводу получения милисекунд - ms VB должён понять. Просто, может быть, я напутал что. Вобщем, сейчас я тут по поводу поста разбирался, ну и накатал примерчик. Он тут.

266
20 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by mhaturov

MAX получит - это ремарка. (В Basic ремарки начинаются с Rem, а в VB можно и Rem, и символ ' использовать. Т.е. всё, что после ' идёт в строке, VB проигнорирует).
По поводу получения милисекунд - ms VB должён понять. Просто, может быть, я напутал что. Вобщем, сейчас я тут по поводу поста разбирался, ну и накатал примерчик. Он тут.


Кстати, так же можно получить и более мелкие интервалы времени, проавда я не помню синтаксис:{

319
20 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by mhaturov

MAX получит - это ремарка. (В Basic ремарки начинаются с Rem, а в VB можно и Rem, и символ ' использовать. Т.е. всё, что после ' идёт в строке, VB проигнорирует).
По поводу получения милисекунд - ms VB должён понять. Просто, может быть, я напутал что. Вобщем, сейчас я тут по поводу поста разбирался, ну и накатал примерчик. Он тут.



объявляешь в начале самом:

Код:
Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

и пользуешься любимой функцией:
 
Код:
Private Sub Form_Load()
    Dim SysTime As SYSTEMTIME
    'Set the graphical mode to persistent
    Me.AutoRedraw = True
    'Get the system time
    GetSystemTime SysTime
    'Print it to the form
    Me.Print "The System Date is:" & SysTime.wMonth & "-" & SysTime.wDay & "-" & SysTime.wYear
    Me.Print "The System Time is:" & SysTime.wHour & ":" & SysTime.wMinute & ":" & SysTime.wSecond
End Sub

есть удачный сайт http://www.mentalis.org/index2.shtml
где приводятся прототипы для всех АПИ-функций в VB. С примерами использования
2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
ага, спасибо,

заметил, вот, что если например на один таймер повесить вывод системного времени (например через 100 мс), а на другой через 1 сек. вывод Time, то через несколько минут их значения начинают расходиться, интересно, кому верить?
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
ага, спасибо,

заметил, вот, что если например на один таймер повесить вывод системного времени (например через 100 мс), а на другой через 1 сек. вывод Time, то через несколько минут их значения начинают расходиться, интересно, кому верить?


Если ты о таймерах - контролах, то им вообще верить нельзя - их время крайне приблизительное. Обычто их используют не для определения времени, а для инициации каких-либо событий через некритичные промежутки. Поэтому, наверное Microsoft, ограничило максимальный интервал. отсчитываемый ими (хотя, честно говоря, я отсчитывал ими какие угодно интервалы;) ). Насколько я заню, значения этих таймеров зависят от загрузки машины и массы других параметров. То, что более-менее точно они идут, происходит из-за аппроксимации погрешности на больших, по их понятиям, интервалах времени.

258
21 января 2004 года
SergeySV
1.5K / / 19.03.2003
mhaturov абсолютно прав, верить ни одному из них нельзя потому интервал прихода сообщений от таймера не выдерживается с указанной точностью. Например интервал можно указывать с точностью до 1 мс., но он так никогда не сможет работать, опытным путем определили, что как правило наименьший интервал срабатывания таймера это 20мс. Почему это происходит? Потому что когда в системе устанавливается таймер (его можно установить и через функции API) он начинает посылать сообщения типа WM_TIMER, которые попадают в очередь сообщений приложения и обрабатываются тогда, когда до них доходит очередь, эти сообщения имеют небольшой приоритет и поэтому очень сильно зависят от загрузки компьютера (это легко проверить, если поставить таймер на 1 сек, который обычно работает достаточно четко, сильно нагрузив компьютер вы увидите, что приходить сообщения уже будут через 2,3, 4 и т.д. секунд). Т.е. тут главное не забывать, что таймеры работают в многозадочной опер. системе.
Если же тебе нужен точный таймер, то тогда делают по другому, в программе делают цикл и проверяют кол-во произошедших тактов процессора. В инете достаточно много примеров, набери в поиске - точный таймер.
478
21 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by xelos

есть удачный сайт http://www.mentalis.org/index2.shtml
где приводятся прототипы для всех АПИ-функций в VB. С примерами использования



Кроме того на этом сайте есть ссылочка на,
на первый взгляд Очень Неплохой API Viewer

319
21 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by SergeySV
mhaturov абсолютно прав, верить ни одному из них нельзя потому интервал прихода сообщений от таймера не выдерживается с указанной точностью. Например интервал можно указывать с точностью до 1 мс., но он так никогда не сможет работать, опытным путем определили, что как правило наименьший интервал срабатывания таймера это 20мс. Почему это происходит? Потому что когда в системе устанавливается таймер (его можно установить и через функции API) он начинает посылать сообщения типа WM_TIMER, которые попадают в очередь сообщений приложения и обрабатываются тогда, когда до них доходит очередь, эти сообщения имеют небольшой приоритет и поэтому очень сильно зависят от загрузки компьютера (это легко проверить, если поставить таймер на 1 сек, который обычно работает достаточно четко, сильно нагрузив компьютер вы увидите, что приходить сообщения уже будут через 2,3, 4 и т.д. секунд). Т.е. тут главное не забывать, что таймеры работают в многозадочной опер. системе.
Если же тебе нужен точный таймер, то тогда делают по другому, в программе делают цикл и проверяют кол-во произошедших тактов процессора. В инете достаточно много примеров, набери в поиске - точный таймер.



Кусок из программы "реального" времени на ВБ4.0 (предварительный макет программы делал ) - работает с достаточно маленькой погрешностью, dureeNote равно 20, т.е. операция выполняется каждые 20 мс.

Код:
Dim hThread As Long, hProcess As Long
'retrieve the current thread and process
hThread = GetCurrentThread
hProcess = GetCurrentProcess
'set the new thread priority to "highest"
SetThreadPriority hThread, THREAD_PRIORITY_HIGHEST
'set the new priority class to "realtime"
SetPriorityClass hProcess, REALTIME_PRIORITY_CLASS
-------
            t1=timeGetTime
            SonOn
'laisser windows traiter les messages
            DoEvents
'attendre jusqu'a la fin de la note
            While timeGetTime - t1 < dureeNote
            Wend
'arreter le son
            SonOff

объявление API функций:

Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Насколько я помню. всё начиналось с точного получения системного времени. Это-то как, получилось :P ?
2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
Да, со временем все ОК,

только вот другая проблема вылезла -)
(если не сложно помочь-)

в событии одного ActiveX контрола есть параметр
.....ByVal sMessage As String....

так вот, если например сделать
Label1.Caption = sMessage или
Text1.Text = sMessage
, то все наромально выводит, а если попробовать

MsgBox sMessage или
ListView1.ListItems.Add(, ,sMessage)

, то прога вылетает с ошибкой. Пробовал сначала выделять строку необходимого размера, например

Dim sss As String *10
sss = sMessage
MsgBox sss

все равно вылетает с ошибкой, собственно вопрос то в том, почему так происходит, что например в ТекстБокс выводит строку и MsgBox ее не может вывести ?
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
Да, со временем все ОК,

только вот другая проблема вылезла -)
(если не сложно помочь-)

в событии одного ActiveX контрола есть параметр
.....ByVal sMessage As String....

так вот, если например сделать
Label1.Caption = sMessage или
Text1.Text = sMessage
, то все наромально выводит, а если попробовать

MsgBox sMessage или
ListView1.ListItems.Add(, ,sMessage)

, то прога вылетает с ошибкой. Пробовал сначала выделять строку необходимого размера, например

Dim sss As String *10
sss = sMessage
MsgBox sss

все равно вылетает с ошибкой, собственно вопрос то в том, почему так происходит, что например в ТекстБокс выводит строку и MsgBox ее не может вывести ?


На Null пробовал проверять?
И ещё, что за контрол? Как завётся, или твой собственный? Если собственный, то что на raiseEvent у него и где оно?

2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
Цитата:
Originally posted by mhaturov

На Null пробовал проверять?
И ещё, что за контрол? Как завётся, или твой собственный? Если собственный, то что на raiseEvent у него и где оно?



Контрол свой (VC), а на NULL собственно не проверял, так как под отладкой строка видно что не пустая, и кстати под отладкой все работает,
а не работает если exe-ник запускатть

266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser


Контрол свой (VC), а на NULL собственно не проверял, так как под отладкой строка видно что не пустая, и кстати под отладкой все работает,
а не работает если exe-ник запускатть


А событие откуда возвращаешь?
1. Из вобытия изменения чего-то
2. Из чейнджа в комбобоксе
3. Из процедуры (что в ней происходит?)

Какой вид строки? Какие "подозрительные" символы содержит?
Как называется событие, возникающее в твоём контролле?
Попробуй имя возвращаемой переменной поменять (можно прямо в VB-шном коде).

Кстати, с какой ошибкой вылетает прога?

В принципе, msgbox трудно передаваемыми параметрами вывалить... Сообщи, какая ошибка (по описанию).

2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
Цитата:
Originally posted by mhaturov

А событие откуда возвращаешь?
1. Из вобытия изменения чего-то
2. Из чейнджа в комбобоксе
3. Из процедуры (что в ней происходит?)

Какой вид строки? Какие "подозрительные" символы содержит?
Как называется событие, возникающее в твоём контролле?
Попробуй имя возвращаемой переменной поменять (можно прямо в VB-шном коде).

Кстати, с какой ошибкой вылетает прога?

В принципе, msgbox трудно передаваемыми параметрами вывалить... Сообщи, какая ошибка (по описанию).



Ошибка : Инструкция по адресу хххххх обратилась к памяти по адресу уууууу, память не может быть Read

Да вот я уже сам не знаю где глюк искать, либо в VB либо в VC.

Если событие возбуждаю в функции класса моего контрола, то в клиенте (в смысле приложение на VB)
MsgBox выводит строку (параметр события) нормально. А вот если возбуждаю событие из запущенного потока, то клиент вываливается (-. Но опять же, почему тогда в TextBox выводится без проблем строка, а MsgBox не может (событие возбуждаю из потока)



Событие возбуждается у меня из

266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser


Ошибка : Инструкция по адресу хххххх обратилась к памяти по адресу уууууу, память не может быть Read

Да вот я уже сам не знаю где глюк искать, либо в VB либо в VC.

Если событие возбуждаю в функции класса моего контрола, то в клиенте (в смысле приложение на VB)
MsgBox выводит строку (параметр события) нормально. А вот если возбуждаю событие из запущенного потока, то клиент вываливается (-. Но опять же, почему тогда в TextBox выводится без проблем строка, а MsgBox не может (событие возбуждаю из потока)



Событие возбуждается у меня из



Хочу разочаровать - с потоками лучше не париться... Боюсь, тут ни VB, и ни C виноваты, а среда работы екзешника, тоесть Винда...:{ Значит так, есть документация по VB? Будем шаманить (хотя я сам не помню как). Вобщем, компили проект в P-код, а потом, блин, не помню как, но этот экзешник можно дебажить, просматривая как ассемблер, так и VB - код. Это надо будет тебе посмотреть в литературе. Возможно, так отловишь ошибку. Не получиться - попробуй мессагу заполнять не из полученных данных, а из сторонней переменной, только как-нибудь обыграй это похитрее.

2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
Цитата:
Originally posted by mhaturov


Хочу разочаровать - с потоками лучше не париться... Боюсь, тут ни VB, и ни C виноваты, а среда работы екзешника, тоесть Винда...:{ Значит так, есть документация по VB? Будем шаманить (хотя я сам не помню как). Вобщем, компили проект в P-код, а потом, блин, не помню как, но этот экзешник можно дебажить, просматривая как ассемблер, так и VB - код. Это надо будет тебе посмотреть в литературе. Возможно, так отловишь ошибку. Не получиться - попробуй мессагу заполнять не из полученных данных, а из сторонней переменной, только как-нибудь обыграй это похитрее.



Спасибо за советы, буду пробовать.

я правда уже давно заметил, что если что-то работает где-то, то совсем не факт, что в потоках это же самое будет работать так же,скорее совсем не будет работать, но я все пытаюсь как-то обьяснить это своим пока еще малым опытом.

319
21 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by VBuser


Ошибка : Инструкция по адресу хххххх обратилась к памяти по адресу уууууу, память не может быть Read

Да вот я уже сам не знаю где глюк искать, либо в VB либо в VC.

Если событие возбуждаю в функции класса моего контрола, то в клиенте (в смысле приложение на VB)
MsgBox выводит строку (параметр события) нормально. А вот если возбуждаю событие из запущенного потока, то клиент вываливается (-. Но опять же, почему тогда в TextBox выводится без проблем строка, а MsgBox не может (событие возбуждаю из потока)



Событие возбуждается у меня из



Поставь отлавливание исключения месте, где ошибка вылетает, при исключении выводи мессагу исключения, он там довольно ясно говорит из-за чего ошибка. Можно еще GetLastError пользовать, чтобы посмотреть что за ошибка.

2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
кстати, а чем отличается P-Code от Native-Code ?
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
кстати, а чем отличается P-Code от Native-Code ?


P-код вы полняется виртуальной машиной VB в режиме интерпритатора. Native - код - полноценный экзешник, как его компилит в "машинные" коды VB. Машинные - в кавычках, так как, сам понимаешь, на машине без Виндов он работать не сможет по причине того, что не найдёт библиотеки, код которых не включается в экзешник, а подгружается со стороны (ну как любая прога, заточенная под свою ОС). Кстати, на VB.NET уже можно писать под любую платформу. Но... Только интерпритатор, SetUp которого будет тянуть с собою виртуальную машину (насколько я помню, C# так же поступает):{

2.2K
21 января 2004 года
VBuser
25 / / 05.09.2003
и еще добавить, что клиент моего контрола на VC работает вроде без проблем, на VB глюки


всякий раз когда наинаю писать что-то, в смысле небольшое диалоговое приложение, начинаю с VB, заканчиваю VC -)
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
и еще добавить, что клиент моего контрола на VC работает вроде без проблем, на VB глюки


всякий раз когда наинаю писать что-то, в смысле небольшое диалоговое приложение, начинаю с VB, заканчиваю VC -)


Вспомнил (спросил) порядок дебага:
1. В месте, где валиться, указать Debag.Break (API)
2. При компиляции указать Create Symbolic Debug Info в настройках проекта
3. Компилить в Native код
4. Запустить на выполнение
5. При появлении ошибки выбрать Cancel
6. После того, как попадёшь в ASM – редактор (сюшная среда), нажать 2 раза F11.
Дальше – по обстоятельствам (VB – код уже откроется)

266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by VBuser
и еще добавить, что клиент моего контрола на VC работает вроде без проблем, на VB глюки


всякий раз когда наинаю писать что-то, в смысле небольшое диалоговое приложение, начинаю с VB, заканчиваю VC -)


Если описанное выше не даст результатов, то попробуй в момент ошибки просмотреть мап памяти - по-моему, твой поток пишет данные в ту же область, где среда пытается сохранить данные для лэйбла мессаги. Ну а как найдёшь причину - там, думаю, сумеешь её устранить.
Попробуй ещё в сбойной процедуре другую мессагу выводить (с данными из друпеременной) и посмотри, что тогда будет.

2.3K
30 марта 2004 года
goodzvb
41 / / 13.01.2004
Функция DebugBreak ... че ж вы народ в оману вводите.

Объявление
Public Declare Sub DebugBreak Lib "kernel32" Alias "DebugBreak" ()

Парился с вашим debag.break, пока добрый мхатуров не наставил на путь истинный :)
266
30 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by goodzvb
Функция DebugBreak ... че ж вы народ в оману вводите.

Объявление
Public Declare Sub DebugBreak Lib "kernel32" Alias "DebugBreak" ()

Парился с вашим debag.break, пока добрый мхатуров не наставил на путь истинный :)


Вообще-то mhaturov по невнимательности и сбил всех с пути истинного:D . Я случайто вместо DebugBreak написал Debug.Break, а потом всем сюда ссылку давал. А по поводу функции ничего не написал, потому как на вскидку не помнил объявления её и думал, что в API Viewer'е её найдут. Очень прошу меня извинить, если кого с толку сбил. Уважаемый goodzvb тут как раз всё правильно указал, как должно быть.:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог