аналог GetSystemTime() в VB есть ?
так что бы можно было получить системное время с точностью до одной милисекунды?
Примерно так (за 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")) 'МАХ получит только милисекунды
ругается на формат, скорее всего "ms", т.к. такого вроде нет по справке,
и что значит "MAX получит" ?
Tm1 = Format(Time, "hh.mm.ss.ms") 'МАХ получит
ругается на формат, скорее всего "ms", т.к. такого вроде нет по справке,
и что значит "MAX получит" ?
MAX получит - это ремарка. (В Basic ремарки начинаются с Rem, а в VB можно и Rem, и символ ' использовать. Т.е. всё, что после ' идёт в строке, VB проигнорирует).
По поводу получения милисекунд - ms VB должён понять. Просто, может быть, я напутал что. Вобщем, сейчас я тут по поводу поста разбирался, ну и накатал примерчик. Он тут.
MAX получит - это ремарка. (В Basic ремарки начинаются с Rem, а в VB можно и Rem, и символ ' использовать. Т.е. всё, что после ' идёт в строке, VB проигнорирует).
По поводу получения милисекунд - ms VB должён понять. Просто, может быть, я напутал что. Вобщем, сейчас я тут по поводу поста разбирался, ну и накатал примерчик. Он тут.
Кстати, так же можно получить и более мелкие интервалы времени, проавда я не помню синтаксис:{
MAX получит - это ремарка. (В Basic ремарки начинаются с Rem, а в VB можно и Rem, и символ ' использовать. Т.е. всё, что после ' идёт в строке, VB проигнорирует).
По поводу получения милисекунд - ms VB должён понять. Просто, может быть, я напутал что. Вобщем, сейчас я тут по поводу поста разбирался, ну и накатал примерчик. Он тут.
объявляешь в начале самом:
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
и пользуешься любимой функцией:
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. С примерами использования
заметил, вот, что если например на один таймер повесить вывод системного времени (например через 100 мс), а на другой через 1 сек. вывод Time, то через несколько минут их значения начинают расходиться, интересно, кому верить?
ага, спасибо,
заметил, вот, что если например на один таймер повесить вывод системного времени (например через 100 мс), а на другой через 1 сек. вывод Time, то через несколько минут их значения начинают расходиться, интересно, кому верить?
Если ты о таймерах - контролах, то им вообще верить нельзя - их время крайне приблизительное. Обычто их используют не для определения времени, а для инициации каких-либо событий через некритичные промежутки. Поэтому, наверное Microsoft, ограничило максимальный интервал. отсчитываемый ими (хотя, честно говоря, я отсчитывал ими какие угодно интервалы;) ). Насколько я заню, значения этих таймеров зависят от загрузки машины и массы других параметров. То, что более-менее точно они идут, происходит из-за аппроксимации погрешности на больших, по их понятиям, интервалах времени.
Если же тебе нужен точный таймер, то тогда делают по другому, в программе делают цикл и проверяют кол-во произошедших тактов процессора. В инете достаточно много примеров, набери в поиске - точный таймер.
есть удачный сайт http://www.mentalis.org/index2.shtml
где приводятся прототипы для всех АПИ-функций в VB. С примерами использования
Кроме того на этом сайте есть ссылочка на,
на первый взгляд Очень Неплохой API Viewer
mhaturov абсолютно прав, верить ни одному из них нельзя потому интервал прихода сообщений от таймера не выдерживается с указанной точностью. Например интервал можно указывать с точностью до 1 мс., но он так никогда не сможет работать, опытным путем определили, что как правило наименьший интервал срабатывания таймера это 20мс. Почему это происходит? Потому что когда в системе устанавливается таймер (его можно установить и через функции API) он начинает посылать сообщения типа WM_TIMER, которые попадают в очередь сообщений приложения и обрабатываются тогда, когда до них доходит очередь, эти сообщения имеют небольшой приоритет и поэтому очень сильно зависят от загрузки компьютера (это легко проверить, если поставить таймер на 1 сек, который обычно работает достаточно четко, сильно нагрузив компьютер вы увидите, что приходить сообщения уже будут через 2,3, 4 и т.д. секунд). Т.е. тут главное не забывать, что таймеры работают в многозадочной опер. системе.
Если же тебе нужен точный таймер, то тогда делают по другому, в программе делают цикл и проверяют кол-во произошедших тактов процессора. В инете достаточно много примеров, набери в поиске - точный таймер.
Кусок из программы "реального" времени на ВБ4.0 (предварительный макет программы делал ) - работает с достаточно маленькой погрешностью, dureeNote равно 20, т.е. операция выполняется каждые 20 мс.
'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
только вот другая проблема вылезла -)
(если не сложно помочь-)
в событии одного 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 ее не может вывести ?
Да, со временем все ОК,
только вот другая проблема вылезла -)
(если не сложно помочь-)
в событии одного 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 у него и где оно?
На Null пробовал проверять?
И ещё, что за контрол? Как завётся, или твой собственный? Если собственный, то что на raiseEvent у него и где оно?
Контрол свой (VC), а на NULL собственно не проверял, так как под отладкой строка видно что не пустая, и кстати под отладкой все работает,
а не работает если exe-ник запускатть
Контрол свой (VC), а на NULL собственно не проверял, так как под отладкой строка видно что не пустая, и кстати под отладкой все работает,
а не работает если exe-ник запускатть
А событие откуда возвращаешь?
1. Из вобытия изменения чего-то
2. Из чейнджа в комбобоксе
3. Из процедуры (что в ней происходит?)
Какой вид строки? Какие "подозрительные" символы содержит?
Как называется событие, возникающее в твоём контролле?
Попробуй имя возвращаемой переменной поменять (можно прямо в VB-шном коде).
Кстати, с какой ошибкой вылетает прога?
В принципе, msgbox трудно передаваемыми параметрами вывалить... Сообщи, какая ошибка (по описанию).
А событие откуда возвращаешь?
1. Из вобытия изменения чего-то
2. Из чейнджа в комбобоксе
3. Из процедуры (что в ней происходит?)
Какой вид строки? Какие "подозрительные" символы содержит?
Как называется событие, возникающее в твоём контролле?
Попробуй имя возвращаемой переменной поменять (можно прямо в VB-шном коде).
Кстати, с какой ошибкой вылетает прога?
В принципе, msgbox трудно передаваемыми параметрами вывалить... Сообщи, какая ошибка (по описанию).
Ошибка : Инструкция по адресу хххххх обратилась к памяти по адресу уууууу, память не может быть Read
Да вот я уже сам не знаю где глюк искать, либо в VB либо в VC.
Если событие возбуждаю в функции класса моего контрола, то в клиенте (в смысле приложение на VB)
MsgBox выводит строку (параметр события) нормально. А вот если возбуждаю событие из запущенного потока, то клиент вываливается (-. Но опять же, почему тогда в TextBox выводится без проблем строка, а MsgBox не может (событие возбуждаю из потока)
Событие возбуждается у меня из
Ошибка : Инструкция по адресу хххххх обратилась к памяти по адресу уууууу, память не может быть Read
Да вот я уже сам не знаю где глюк искать, либо в VB либо в VC.
Если событие возбуждаю в функции класса моего контрола, то в клиенте (в смысле приложение на VB)
MsgBox выводит строку (параметр события) нормально. А вот если возбуждаю событие из запущенного потока, то клиент вываливается (-. Но опять же, почему тогда в TextBox выводится без проблем строка, а MsgBox не может (событие возбуждаю из потока)
Событие возбуждается у меня из
Хочу разочаровать - с потоками лучше не париться... Боюсь, тут ни VB, и ни C виноваты, а среда работы екзешника, тоесть Винда...:{ Значит так, есть документация по VB? Будем шаманить (хотя я сам не помню как). Вобщем, компили проект в P-код, а потом, блин, не помню как, но этот экзешник можно дебажить, просматривая как ассемблер, так и VB - код. Это надо будет тебе посмотреть в литературе. Возможно, так отловишь ошибку. Не получиться - попробуй мессагу заполнять не из полученных данных, а из сторонней переменной, только как-нибудь обыграй это похитрее.
Хочу разочаровать - с потоками лучше не париться... Боюсь, тут ни VB, и ни C виноваты, а среда работы екзешника, тоесть Винда...:{ Значит так, есть документация по VB? Будем шаманить (хотя я сам не помню как). Вобщем, компили проект в P-код, а потом, блин, не помню как, но этот экзешник можно дебажить, просматривая как ассемблер, так и VB - код. Это надо будет тебе посмотреть в литературе. Возможно, так отловишь ошибку. Не получиться - попробуй мессагу заполнять не из полученных данных, а из сторонней переменной, только как-нибудь обыграй это похитрее.
Спасибо за советы, буду пробовать.
я правда уже давно заметил, что если что-то работает где-то, то совсем не факт, что в потоках это же самое будет работать так же,скорее совсем не будет работать, но я все пытаюсь как-то обьяснить это своим пока еще малым опытом.
Ошибка : Инструкция по адресу хххххх обратилась к памяти по адресу уууууу, память не может быть Read
Да вот я уже сам не знаю где глюк искать, либо в VB либо в VC.
Если событие возбуждаю в функции класса моего контрола, то в клиенте (в смысле приложение на VB)
MsgBox выводит строку (параметр события) нормально. А вот если возбуждаю событие из запущенного потока, то клиент вываливается (-. Но опять же, почему тогда в TextBox выводится без проблем строка, а MsgBox не может (событие возбуждаю из потока)
Событие возбуждается у меня из
Поставь отлавливание исключения месте, где ошибка вылетает, при исключении выводи мессагу исключения, он там довольно ясно говорит из-за чего ошибка. Можно еще GetLastError пользовать, чтобы посмотреть что за ошибка.
кстати, а чем отличается P-Code от Native-Code ?
P-код вы полняется виртуальной машиной VB в режиме интерпритатора. Native - код - полноценный экзешник, как его компилит в "машинные" коды VB. Машинные - в кавычках, так как, сам понимаешь, на машине без Виндов он работать не сможет по причине того, что не найдёт библиотеки, код которых не включается в экзешник, а подгружается со стороны (ну как любая прога, заточенная под свою ОС). Кстати, на VB.NET уже можно писать под любую платформу. Но... Только интерпритатор, SetUp которого будет тянуть с собою виртуальную машину (насколько я помню, C# так же поступает):{
всякий раз когда наинаю писать что-то, в смысле небольшое диалоговое приложение, начинаю с VB, заканчиваю VC -)
и еще добавить, что клиент моего контрола на VC работает вроде без проблем, на VB глюки
всякий раз когда наинаю писать что-то, в смысле небольшое диалоговое приложение, начинаю с VB, заканчиваю VC -)
Вспомнил (спросил) порядок дебага:
1. В месте, где валиться, указать Debag.Break (API)
2. При компиляции указать Create Symbolic Debug Info в настройках проекта
3. Компилить в Native код
4. Запустить на выполнение
5. При появлении ошибки выбрать Cancel
6. После того, как попадёшь в ASM – редактор (сюшная среда), нажать 2 раза F11.
Дальше – по обстоятельствам (VB – код уже откроется)
и еще добавить, что клиент моего контрола на VC работает вроде без проблем, на VB глюки
всякий раз когда наинаю писать что-то, в смысле небольшое диалоговое приложение, начинаю с VB, заканчиваю VC -)
Если описанное выше не даст результатов, то попробуй в момент ошибки просмотреть мап памяти - по-моему, твой поток пишет данные в ту же область, где среда пытается сохранить данные для лэйбла мессаги. Ну а как найдёшь причину - там, думаю, сумеешь её устранить.
Попробуй ещё в сбойной процедуре другую мессагу выводить (с данными из друпеременной) и посмотри, что тогда будет.
Объявление
Public Declare Sub DebugBreak Lib "kernel32" Alias "DebugBreak" ()
Парился с вашим debag.break, пока добрый мхатуров не наставил на путь истинный :)
Функция DebugBreak ... че ж вы народ в оману вводите.
Объявление
Public Declare Sub DebugBreak Lib "kernel32" Alias "DebugBreak" ()
Парился с вашим debag.break, пока добрый мхатуров не наставил на путь истинный :)
Вообще-то mhaturov по невнимательности и сбил всех с пути истинного:D . Я случайто вместо DebugBreak написал Debug.Break, а потом всем сюда ссылку давал. А по поводу функции ничего не написал, потому как на вскидку не помнил объявления её и думал, что в API Viewer'е её найдут. Очень прошу меня извинить, если кого с толку сбил. Уважаемый goodzvb тут как раз всё правильно указал, как должно быть.:)