mboost-dp1
Visual Basic: Måle millisekunder.
- Forside
- ⟨
- Forum
- ⟨
- Programmering
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?
Så er der nogle der har en idé om hvordan jeg skal få timeren til at måle rigtige millisekunder?
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.
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 :)
#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.
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.
Æ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".
#1 Hvis du næste gang skriver ".NET" i stedet for "Visual Basic", så får du en langt større "hjælpegruppe".
#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# !
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# !
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?
Eksempel på brug af StopWatch til at tælle ned fra 10:0045 seconds.
I .NET ;-)
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
));
}
}
}
}
#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.
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.
#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 ;-)
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 ;-)
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.
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;
}
Hmm sjovt at code tags kun tæller linjer op til 100 hvorefter den starter fra 1 (Ihvertfald i #27 :S)
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.)
#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.