mboost-dp1

Visual Basic: Måle millisekunder.


Gå til bund
Gravatar #1 - xXgmzorXx
27. feb. 2010 12:34
I Visual Basic 2008 vil jeg gerne lave en timer som måler i millisekunder. Eller for eksempel bruge timeren til nedtælling af 10,45 sekunder. Jeg har prøvet at sætte interval ned på 10 og indtaste "1045", men tiden bliver ikke rigtig fordi at den tæller ca. 3sek for langsomt?

Så er der nogle der har en idé om hvordan jeg skal få timeren til at måle rigtige millisekunder?
Gravatar #2 - reefermadness  
27. feb. 2010 13:08
Du kan vel bruge GetTickCount() til at holde styr på hvor mange millisekunder der er gået..
Gravatar #3 - arne_v
27. feb. 2010 13:48
#1

Du kan ikke få et genelt styresystem som Windows til at udføre noget med præcist 10 sekunders interval.

Hvis du i.s.f. at lave 1045 hop af 10 ms så laver 105 hop af 100 ms, så kommer tiden til at passe meget bedre.
Gravatar #4 - myplacedk
27. feb. 2010 14:03
xXgmzorXx (1) skrev:
Jeg har prøvet at sætte interval ned på 10 og indtaste "1045", men tiden bliver ikke rigtig fordi at den tæller ca. 3sek for langsomt?

Jeg gætter på at du har lavet den typiske fejl:

1) gør noget (fx. opdatering af display)
2) vent 10 ms
3) gå til 1

Tiden for hvert interval er ikke 10 ms, men 10 ms + tid til at udføre trin 2.

Tricket enten:

1) Noter tiden
2) Gør noget
3) Vent til der er gået 10 ms siden punkt 1

Eller

1) Vent 10,45 sekunder
Og i en anden tråd:
Gør noget med et eller andet interval, behøve ikke at være så præcist.
Gravatar #5 - Mort
28. feb. 2010 09:09

Stopwatch Class
Provides a set of methods and properties that you can use to accurately measure elapsed time.
Gravatar #7 - xXgmzorXx
1. mar. 2010 05:14
Thanks. Så må jeg lige se om jeg kan finde ud af at bruge det...
Gravatar #8 - Mort
1. mar. 2010 07:13
Windcape (6) skrev:
#5

Du glemte linket: http://msdn.microsoft.com/en-us/library/system.dia...


Jeg har MSDN installeret lokalt, så et link til "ms-help://MS.MSDNQTR.v90.en/fxref_system/html/9cbab0ce-8dc8-2ee8-101e-638a69809fca.htm" vil ikke være så brugbart for xXgmzorXx :)
Gravatar #9 - Windcape
1. mar. 2010 07:24
#8

I det mindste så giv manden et fully qualified name så han kan slå det op ;-)

Jeg hader at skulle finde ud af hvilket assembly kode tilhører.
Gravatar #10 - Mort
1. mar. 2010 08:39
#9

Ah ja, det kan jeg gøre en anden gang. Godt nok findes der kun en enkelt stopwatch class i .NET framework, men det skader da ikke at skrive namespacet på den også.

Da der kun var listet den ene stopwatch klasse i mit MSDN library, så faldt det mig ikke ind også at skrive namespacet.
Gravatar #11 - illishar
1. mar. 2010 08:55
Æv, jeg troede at der var en fortabt sjæl, som der stadigvæk hang fast i VB. (Så kunne jeg have bashet ham, med min ufattelige mængde, ubruglige VB-viden. Nu må jeg finde nogle andre at trolle.)


#1 Hvis du næste gang skriver ".NET" i stedet for "Visual Basic", så får du en langt større "hjælpegruppe".
Gravatar #12 - illishar
1. mar. 2010 09:04
#3 Nu har jeg godt nok mest lavet drivere til *nix, men tilslutter du en interrupt-styrret driver til en høj irq, så bør du få præcision i us-klassen. Kombiner den med en DMA e.l. til outputtet og så har du et atom-ur! ... sådan da ;)
Gravatar #13 - Windcape
1. mar. 2010 13:27
#11

Jeg vidste det fra denne her tråd :p

http://newz.dk/forum/programmering/visual-basic-ko...

Derudover forstår jeg stadigvæk ikke at han (spilder?) bruger sin tid på at lære VB.NET i stedet for C# !
Gravatar #14 - xXgmzorXx
1. mar. 2010 13:56
Imports System.Threading

Public Class Form1

Shared Sub Main(ByVal args() As String)
Dim Timer As New Stopwatch()
Timer.Start()
Thread.Sleep(10000)
Timer.Stop()
' Get the elapsed time as a TimeSpan value.
Dim ts As TimeSpan = Timer.Elapsed
' Format and display the TimeSpan value.
Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
Console.WriteLine(elapsedTime, "AAA")
End Sub 'Main
Private Sub Label1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.TextChanged
Label1.Text = Console.ReadLine.StartsWith("AAA")
End Sub
End Class


Men jeg får fejl her?
Gravatar #15 - Windcape
1. mar. 2010 13:57
#14

Først og fremmest, screenshots er no-go. Du kan paste din exception message på forumet.

Derudover så står der jo lodret at du skal læse InnerException, så hvorfor gør du ikke det?
Gravatar #16 - xXgmzorXx
1. mar. 2010 13:58
Windcape (13) skrev:
Derudover forstår jeg stadigvæk ikke at han (spilder?) bruger sin tid på at lære VB.NET i stedet for C# !


Kan bare ikke lide C# Hah ;b
Jeg skal nok komme igang med det på et tidspunkt, men jeg syntes at .net er nemmere.
Gravatar #17 - Windcape
1. mar. 2010 13:59
#16

.NET er et framework som består af C#, VB.NET, Visual C++ og F# som first-class languages.

Man programmerer hovedsageligt med C# når man arbejder med .NET.

Det er 110% forkert at kalde VB.NET for .NET, de ene er et sprog, det andet et framework.
Gravatar #18 - Windcape
1. mar. 2010 14:00
#14

Derudover bruger man ikke Main() metoder i Forms!

Du roder vist fuldstændig rundt i hvad du vil programmere.
Gravatar #19 - Windcape
1. mar. 2010 14:17
Eksempel på brug af StopWatch til at tælle ned fra 10:0045 seconds.

I .NET ;-)


using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace TimerFun
{
public partial class MainForm : Form
{
private Stopwatch stopWatch = new Stopwatch();
private TimeSpan total = new TimeSpan(0, 0, 0, 10, 45);

public MainForm()
{
InitializeComponent();
}

private void GoButton_Click(object sender, EventArgs e)
{
stopWatch.Start();

new Thread(new ThreadStart(ShowElapsedTime)).Start();
}

private void ShowElapsedTime()
{
while (stopWatch.IsRunning)
{
TimeSpan ts = total - stopWatch.Elapsed;

if ((stopWatch.Elapsed.Seconds == 10)
&& (stopWatch.Elapsed.Milliseconds == 45))
{
stopWatch.Stop();
}

var elapsed = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds
);

Invoke((Action)(
() => timerTextBox.Text = elapsed
));
}
}
}
}
Gravatar #20 - xXgmzorXx
1. mar. 2010 14:58
Hvad er det ved C# der gøre det bedre?
Gravatar #21 - Windcape
1. mar. 2010 16:09
#20

Alting! (Altså udover det faktum at jeg er hamrende elendig til VB).

Men som jeg har vist tidligere kan du bare konvertere koden direkte hvis du har lyst.
Gravatar #22 - illishar
2. mar. 2010 08:42
#20 Rent teoretisk er der ikke noget der gør C# bedre end VB.NET. Men C# har Microsofts hovedfokus i forbindelse med udvikling af .NET-frameworket. D.v.s. at nye syntax-tricks, kode-stil mm. har en tendens til, først at komme til C#. Der har derudover også altid gået rygter om bedre optimerede compileringer ifm. C# vs. VB.NET.
Derudover understøtter VB.NET også stadigvæk det gamle VB-framework. Eg. MsgBox, Asc, Chr, Str$ o.s.v. Samt dets evne til "ikke-objekt-orientering", unstrict type casts, dynamisk oprettelse af variable o.s.v.
De gamle VB-features er med god grund, koncepter som man har gjort op med og som man har aflivet i de fleste moderne sprog. De findes dog i VB.NET grundet bagud-kompabilitet og en vis datalogisk afsky for VB.NET er derfor ikke uberettiget ;)

Læg forøvrigt også mærke til din egen brug af "Handles"-syntaxen, til at styre events med. Denne feature får i sig selv, tit VB ud i problemer, grundet utransparent (og skiftende) styring af events.

Dog hvis du holder dig til den kode-stil som Windcape præsenterer (bare med VB-syntax), så er der nok mest kun fordomme til forskel.
Gravatar #23 - Windcape
2. mar. 2010 10:02
#22

I valget af sprog må visse syntak features tælles med som en fordel for C# !

(Og i C# 4.0 har C# også dynamic, default values til parameters, optional paramters og mere.)

Jeg mener at Hejlsberg (eller var det Torgensen, har jeg glemt) har snakket om nogle C# 4.0 features som ikker kommed med i VB. Eller også var det F# features som kom med i C#, men ikke i VB *shrugs*

Men fordelen ved valg af C# er helt klart at der er flere som kan kode i det end i VB.NET ;-)
Gravatar #24 - xXgmzorXx
2. mar. 2010 15:14
Og hvad så med c++?
Gravatar #25 - Windcape
2. mar. 2010 15:22
#24

Hvis du skal arbejde med GUI vil jeg fraråde C++. Specielt hvis du skal arbejde med GUI *og* threading! (som i eksemplet fra #19).

Du burde nok bruge noget tid på at læse op hvad de forskellige teknologier bruges til.
Gravatar #26 - arne_v
2. mar. 2010 17:45
Windcape (25) skrev:

Hvis du skal arbejde med GUI vil jeg fraråde C++. Specielt hvis du skal arbejde med GUI *og* threading! (som i eksemplet fra #19).

Du burde nok bruge noget tid på at læse op hvad de forskellige teknologier bruges til.


Nu er det ikke fordi at jeg vil anbefale C++ til GUI udvikling, men jeg vil da tro at 80-90% af denne verdens fat client GUI's er skrevet i C/C++. Windows Explorer, Microsoft Office, Internet Explorer, Firefox, OpenOffice, KDE, Gnome og en masse andet.
Gravatar #27 - Windcape
2. mar. 2010 19:53
Bare for at skræmme ham, rå WINAPI der opretter et vindue uden knapper, textbox eller funktionalitet. Altså svarende til en tom form i C#/VB.NET:


// TimerFun.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "TimerFun.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;

// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TIMERFUN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TIMERFUN));

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}

//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TIMERFUN));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TIMERFUN);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 228, 83, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}
Gravatar #28 - Windcape
2. mar. 2010 19:54
Og i WINAPI programmering med C++ er inline dokumentation en nødvendighed for at huske hvad man selv har gang i!
Gravatar #29 - reefermadness  
2. mar. 2010 22:31
Hmm sjovt at code tags kun tæller linjer op til 100 hvorefter den starter fra 1 (Ihvertfald i #27 :S)
Gravatar #30 - markjensen
2. mar. 2010 22:55
Baggrund for kodeboks

Men ja, det er lidt en sjov måde at gøre det på.
Gravatar #31 - arne_v
3. mar. 2010 02:20
reefermadness (29) skrev:
sjovt at code tags kun tæller linjer op til 100 hvorefter den starter fra 1


Pussigt, men næppe noget stort problem.

Der er langt værre problemer med code tag. Bl.a. er den ikke god til lange linier.
Gravatar #32 - arne_v
3. mar. 2010 02:21
Windcape (28) skrev:
Og i WINAPI programmering med C++ er inline dokumentation en nødvendighed for at huske hvad man selv har gang i!


Og for en god ordens skyld:
* Win32 API er C (men kan naturligvis også bruges i C++)
* for C++ ville man nok typisk bruge MFC
Gravatar #33 - arne_v
3. mar. 2010 02:22
Windcape (27) skrev:
rå WINAPI der opretter et vindue uden knapper, textbox eller funktionalitet. Altså svarende til en tom form i C#/VB.NET:


Den kode er længere end nødvendigt.

Og boilerplate for main er ikke den bedste målestok for kompleksitet i GUI framework.
Gravatar #34 - Windcape
3. mar. 2010 06:34
Ja, MFC ville være bedre (og noget mere simpelt!) :-)
Gravatar #35 - illishar
3. mar. 2010 08:26
Ah, der er ikke noget som et godt C WINAPI-program. Det er til enhver tid at foretrække frem for MFC. (MFC er kryptisk i bedste fald og man ender alligevel altid med at bruge WINAPI til de specifikke funktioner.)

#24 Hvis du søger efter et alternativ til VB.NET, som ikke er C#, så kunne Java være et fint bud. (Men det minder nu altså lidt om C# og så skal du forøvrigt tillære dig et helt nyt framework.)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login