Programujeme ve Visual Basic .NET - 8.díl - nekonečné smyčky

Diskuze čtenářů k článku

Petrik  |  11. 10. 2004 14:29  | 

Pro úplnost ještě příkládám C# ve rzi ukázkového programu pro výpočet součtu od jedné do iMAX.
C# používá konstrukci do-while s následujícím zápisem:


  do příkaz(y) while (podmínka);
 
class clsMain {
  static&n bsp;void Main() {
    const int iMAX = 100;
  &nbs p; int suma = 0, incr = 0;
&nbs p;   do {
      incr = incr + 1;    & nbsp; // zkracene lze zapsat:   incr++;
      suma = suma + incr;   // zkracene lze zapsat:   suma&nb sp;+= incr;
      }
    while(incr < iMAX);
    System.Console.WriteLine("suma: ");
    ; System.Console.WriteLine(suma);
  }
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
p  |  12. 10. 2004 14:54  | 

a pre informaciu:

class clsMain {
static void Main() {
const long iMax = 100;
System.Console.WriteLine("suma: {0}", (1+iMax)*iMax/2);
}
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  15. 10. 2004 04:36  | 

Ano, takto se vypočítá součet čísel od jedné do iMax s využitím známého Gaussova vztahu pro součet řady 1 + 2 + 3 + ... + iMax.
 

Jednoduššeji a rychleji už daný příklad asi spočítat nejde (pokud neuvažujeme zápis kódu v assembleru).

Souhlasím  |  Nesouhlasím  |  Odpovědět
FatalDooM  |  11. 10. 2004 22:38  | 

No zacal jsem s vasim serialem trosku pozdeji...jsem ted u 3tiho dilu a zatim to zvladam :) Jen jsem si ted zkusil z tohoto dilu zkopcit ten vypocet pokud dam vetsi hodnotu nez iMax = 1000000 tak o 2-3 nuly navic tak uz se komp trosku zapoti super je sledovani zateze CPU :)
btw. dal by se pak udelat jednoduchy benchmark, kdyby se dalo spocitat za jakou dobu byl vysledek spocitan, nee ?? je to moc tezke ? Pokud by to nebyl moc velky problem tak to zkuste nekdy v dalsich dilech naznacit jak na to! Jinak jdu mrknout na 4ty dil at vas dozenu....

Souhlasím  |  Nesouhlasím  |  Odpovědět
jmeno  |  12. 10. 2004 14:52  | 

Jasně, k odměřování časových intervalů se ještě dostaneme. Hodnota času se VB.NET udržuje ve struktuře System.DateTime, jejíž výchozí hodnotou je člen Now(). Pomocí něj si můžeme na začátku a na konci výpočtu ukládá aktuální hodnota datumu a času. Pak je možné postupovat celkem třemi způsoby:
 

Buďto vypočítáme časový rozdíl pomocí funkce Microsoft.VisualBasic.DateDiff - ale ta má rozlišení jen na celé vteřiny
Nebo časový rozdíl spočítáme metodou Subtract(), která vrací objekt třídy TimeSpan. Ten jde vyjádřit až s rozlišením milisekund.
Nebo konečně vypočteme časový rozdíl jako rozdíl mezi hodnotami členů Ticks struktury  System.DateTime. Ten vrací číslo s rozlišením na 0.1 μsec (100 nanosec).
 
Upozorňuju, že třída  System.DateTime i přes rozlišení členu Ticks není nejpřesnější metoda k odečítání časových rozdílů, protože ji systém aktualizuje s frekvencí mnohem nižší (cca 50 ms na Win9X, cca 10 msec na WinNT/2K/XP) danou periodou přepínání kontextu procesů. Pro odečítání času s maximální možnou přesností je nutné využívat systémový multimedia timer (implementovaný knihovnou winmm.dll), který je odvozen od taktovací frekvence procesoru (viz např. http://support.microsoft.com/default.aspx?scid=KB;en-us;Q172338) a má rozlišení typicky pod jednu milisekundu.
 

 Module modMain
  Sub Main()
    Const iMAX = 2000000< BR>    Dim suma = 0,  incr = 0, tStart = System.DateTime.N ow, tStop
    System.Console.Writ eLine(tStart)
    Do
  &n bsp;   incr = incr + 1&nbs p;: If incr > iMAX Then Exit  Do
      suma =&n bsp;suma + incr
    Loop
    System.Console.WriteLine("suma:  ")
    System.Console.WriteLine(suma)< BR>    Dim tsDiff = System .DateTime.Now.Subtract(tStart)
    Sys tem.Console.WriteLine("Doba výpočtu: {0},{1} s ec", tsDiff.Seconds, tsDiff.Milliseconds)
     System.Console.WriteLine("Doba výpočtu : " & (System.DateTime.Now.Ticks -&nb sp;tStart.Ticks) * 0.0000001 & "  ;sec")
  End Sub
End Module

 
vypíše do konzole následující text :
 12.10.2004 14:20:00
suma:
2000001000000
Doba výpočtu: 1,654 sec
Doba výpočtu: 1,6973002 sec

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik, Petrik  |  12. 10. 2004 15:00  | 

Příspěvky v nezmršené formě naleznete na
http://vbnet.aspweb.cz/vbnet/do-loopcs.htm
http://vbnet.aspweb.cz/vbnet/timespan.htm

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik, Petrik  |  12. 10. 2004 15:03  | 

Pro odměřování času má .NET ještě jednu třídu, System.Environment.TickCount  - ale tu nedoporučuji používat, jelikož disponuje časovým rozlišením jen asi půl vteřiny.

Souhlasím  |  Nesouhlasím  |  Odpovědět
FatalDooM  |  12. 10. 2004 20:52  | 

Musim se podelit o vysledek :)))
Doba výpočtu: 0,875 sec
Doba výpočtu: 0,984375 sec

Parada diky moc aspon mam s cim si hrat :) btw. mereno na me sestave AMD64 2800+ 1800@2070 MHz :)
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
FatalDooM  |  12. 10. 2004 21:05  | 

blba mp3 ka mi zhorsila cas :) Ted jsem dal :
 
Doba výpočtu: 0,781 sec
Doba výpočtu: 0,796875 sec

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  12. 10. 2004 22:49  | 

A co teprv, když si proměnné s nepatrnou úpravou nadeklarujete takhle....   
  
Dim suma& = 0, incr& = 0
 
VB.NET umí být velice rychlý - a to ještě není zdaleka ta nejrychlejší varianta popsaného algoritmu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  12. 10. 2004 23:00  | 

P.S.: K tomu, aby jste plně využil platformu pro výpočet v pevné řádové čárce na 64-bitech by jste měl mít nainstalovanou 64-bitovou verzi .NET Frameworku. Docela by mě zajímaly srovnání reálných výsledků 32-bitové a 64-bitové verze.
 
32-bitový .NET počítá s 64-bitovými proměnnými sice rychle, nicméně však emulovaně - což by se právě na této ukázce mělo zřetelně projevit.
 
http://msdn.microsoft.com/netframework/downloads/updates/default.aspx

Souhlasím  |  Nesouhlasím  |  Odpovědět
FatalDooM  |  13. 10. 2004 11:01  | 

To bych prvni potreboval 64-bit XP a ty nemam ani je nehodlam pouzit na to je jeste cas.... dokud nebudou na 100% vyladene ovladace a soft, ktery vyuziju tak do toho nejdu :( a to jeste tak minimalne rok bude.... spis to vidim az na Longhorn !
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
nop  |  14. 10. 2004 13:57  | 

Dají se v tomhle robit programy i pro PDA s Win,případně co je složitější C-cko.NET nebo VB.NET? Prosím nekamenujte mě za tento dotaz :o) jsem naprostej začátečník,a nechci dělat něco velkýho jen menší prográmky na práci se seriovým portem,jde mi o řízení malýho robota s PDA..

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik, Petrik  |  14. 10. 2004 16:49  | 

Pro vývoj aplikací pro PDA/MDA se systémy PocketPC budete potřebovat CompactFramwerk (NetCF)

http://download.microsoft.com/download/8/e/e/8eeda6a6-e64d-4af4-8fae-96efb2c6adde/NETCFSetup.msi
 
a vývojové prostředí, podporující NetCF, např. free SharpDevelop nebo Visual Studio.
 
http://heanet.dl.sourceforge.net/sourceforge/sharpdevelop/SharpDevelop_1.0.1.1649_Setup.exe

http://builder.com.com/5100-6373-5058486.html?tag=sc
 
Ačkoliv jednodušší aplikace jde zkompilovat stejně jako normální .NET aplikace z příkazové řádky,
 
viz např. http://blogs.msdn.com/davidklinems/archive/2004/09/01/224427.aspx
 
budete mít ale problém s jejich spouštěním na PDA, pokud na něm nebudete mít nainstalovaný NetCF předem.
 
Naproti tomu Visual Studio Vám průběžné instalaci i ladění aplikací v PDA nebo emulátoru obstará automaticky. Pro seriózní vývoj na PDA lze VS.NET jen doporučit.
Co se týče složitosti programování v C# proti VB.NET, jsou to prakticky rovnocenné jazyky a nemáte-li zkušenosti s BASICem, lze pro vážnější práci doporučit spíše C# jako čistší a strukturovanější jazyk. Syntaxe VB.NET je volnější a pro začátečníky v programování snad i trochu čitelnější - na druhé straně pro VB.NET obecně existuje na internetu méně ukázek kódu pro .NET i NetCF, než pro C#.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petriku Pomoc  |  14. 10. 2004 22:51  | 

Spravil som jednoduchu aplikaciu, ktora zobrazuje tabulku z databazy (klasika datasety, connection apod.)
Vsetko podla navodu. Funguje to perfektne az na jednu "malickost"
Ked sa zobrazi datagrid, musim v nom najprv kliknut na hyperlink a rozbalit tabulku, potom zmizne a tabulka uz vyzera OK.
Problem asi bude niekde vo vlastnosti DataMember, ale cokolvek tam skusam vlozit (meno tabulky, stlpca atd) - nic nefunguje
 
dik

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  15. 10. 2004 04:09  | 

Ano - i podle mě je problém v nastavení členu DataGrid.DataMember, protože objekt ADO.NET Dataset pro DataGrid vystupuje jako in-memory databáze, která může obsahovat "libovolný" počet tabulek - a DataGrid "neví", kterou má zobrazit jako výchozí - proto Vám zobrazí pouze jeden či více odkazů na tabulky přítomné v DataSet-u.
 
To, kterou tabulku má DataGrid aktuálně zobrazit lze definovat buďto nastavením vlastnosti DataGrid.DataMember, nebo (obecněji) voláním metody DataGrid.SetDataBindings (). V obou případech je nutné předat název tabulky - což však není jméno fyzické tabulky v nějaké databázi (zdrojem dat DataSet-u totiž nemusí být vůbec fyzická tabulka, ale třeba kolekce nebo pole, vytvořené v paměti) - ale jméno tabulky v DataSet-u, který se definuje např. při volání metody SqlDataAdapter.Fill() a získá se jako vlastnost TableName.
 
Níže uvedená ukázka to demonstruje názorně - znázorňuje databinding DataGrid-u na objekt DataSet se dvěma tabulkami, které se v databázi jmenují publishers a titles, zatímco v samotném DataSet-u jsou označeny prostě P a T. Volání metody SetDataBindings proto používá jméno "P" nikoliv "publishers": Výsledkem je DataGrid navázaný na tabulku publishers a obsahující linky na tabulku titles relačně svázanou přes relaci "Publisher Titles".  Doufám, že Vám ukázka pomůže pochopit, jak databinding DataGridu přesně funguje a jak jej lze využít pro tvorbu složitějších formulářů s relačně provázanými tabulkami,
 

Imports System.Drawing, System.Windows.Forms, System.Data, System.Data.SqlClient
Module modMain
Sub Main()
With New Form
Dim DG As New DataGrid, DS As New DataSet, sCon$ = "Data Source=(local);Initial Catalog=pubs;Integrated Security=SSPI"
With New SqlDataAdapter("SELECT * FROM publishers", sCon): .Fill(DS, "P"): End With
With New SqlDataAdapter("SELECT * FROM titles", sCon): .Fill(DS, "T"): End With
DS.Relations.Add(New DataRelation("Publisher titles", DS.Tables("P").Columns("pub_id"), DS.Tables("T").Columns("pub_id")))
With DG
.Location = New Point(20, 20): .Size = New Size(500, 400): .Anchor = 15: .CaptionText = "Title publishers"
.SetDataBinding(DS, "P")
End With
.ClientSize = New Size(550, 450): .StartPosition = 1: .Text = "Hiearchical SQL data source demo"
.Controls.Add(DG): .ShowDialog()
End With
End Sub
End Module

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  15. 10. 2004 04:28  | 

Ještě poznámka - nemáte-li Visual Studio.NET, můžete si ukázku zkompilovat z příkazové řádky následovně (viz první díl seriálu o kompilaci z příkazové řádky):
 
vbc.exe /t:winexe /r:System.DLL,System.Windows.Forms.DLL,System.Data.DLL,System. Drawing.DLL /out:program.exe zdrojak.vb

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  15. 10. 2004 04:23  | 

Takže stručná odpověď zní:
Zkuste jako vlastnost DataDrid.Datamember nastavit vlastnost TableName příslušné tabulky DataSetu.
Obsahuje-li pouze jedinou, což je častý případ - pak např.:
 
        myDataGrid.DataMember = myDataSet.tables(0).TableName 
 
.....a mělo by to začít fungovat.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petriku Pomoc  |  18. 10. 2004 19:01  | 

Super, pomohlo to, do load udalosti formulara som pridal
dataSet1.Clear()
oracleDataAdapter1.Fill(dataSet1)
dataGrid1.DataMember = dataSet1.Tables(0).TableName
 
a krasne to ide. Ostava uz len jeden problem - ako zistim ze kolekce DataTables ma vlastnost TableName, nejako sa nemozem dopatrat.
Ale aj ked neodpoviete diky - super - mam po probleme

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  20. 10. 2004 00:47  | 

K tomu, aby jste získal prvky DataSetu musíte nejprve získat jeho instanci. Vlastnost TableName není vlastností kolelekce, ale členů kolekce - takže musíte doplnit i index (např. 0). Teprve pak bude mít IntelliSense Visual Studia dostatek informací k vylistování členů dané třídy. Pokud si nejste jist, nezbývá, než se podívat do nápovědy, nebo si prolistovat strukturu tříd Datasetu vhodným browserem, třeba takovým, jako je součástí instalace WebMatrixu, nebo .NET Framework SDK.
 
Až se s několika takovými třídami seznámíte lépe, pochopíte vnitřní souvislosti jejich návrhu a budete odhadovat jejich členy popaměti.
 

 
Na jednotlivé členy kolekcí, tedy i kolekce Tables se můžete odkazovat jak indexem, tak jménem - ostatně od toho tam ty tabulky jméno mají.
Stačí si prolistovat přetížené metody nabízené Intellisense v IDE.
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  20. 10. 2004 01:17  | 

Součástí instalace free vývojového prostředí WebMatrix nebo .NET Framework SDK (linky ke stažení viz např. Google) najdete malou, ale užitečnou utilitu, tzv. ClassBrowser, která vám umožní rychle prohledat jmenný prostor jakékoliv tříd .NET, nebo ho i full-textově prohledat. Postup procházení hiearchií namespaces je názorně vidět ze screenshotu.
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik help  |  21. 10. 2004 15:38  | 

VB obsahuje zaujimavy prvok datagrid, ktory je vynikajuci pre male tabulky. Avsak ak v nom mam zobrazit napr. 100 000 riadkov pomocou DataSet, trva nacitanie prilis dlho a zabera mnozstvo pamate. Preto planujem nacitat si riadky pomocou DataReader a vzdy len tolko kolko je este prijatelne vzhladom na pamat a vykon, napr.1000. Potom ich presuniem do DataSet a zobrazim v DataGrid. Ale potom mi napr. ScrollBar bude zobrazovat stav aky ma pri 1000 riadkoch
Je nejako mozne pretazit funkcie datagrid, aby mi napr. ScrollBar ukazoval realnu situaciu, ze je na 254.riadku zo 100000 a ked naskrolujem na posledny riadok, nacitam si dalsich 1000 riadkov ?
Alebo to mozne nie je a musim si vytvorit vlastny datagrid ? (to by som nerad)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  24. 10. 2004 14:58  | 

Máte několik možností, ale v zásadě nemusíte vytvářet vlastní Datagrid. Jedna z možností (v podstatě zahrnující Váš postup) je zahrnuta v tomto odkazu:
 
How To Perform Paging with the DataGrid Windows Control by Using Visual Basic .NET
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;chs320626
 
Pokud vyvíjíte aplikaci jen pro sebe nebo své nejbližší okolí, můžete použít DataGridView a DataNavigator z VB.NET 2005 Express beta. Níže uvádím linky na stažení z webu MSDN. Tyto prvky již podporu stránkování zahrnují a budou zahrnuty v nejbližší verzi .NET Framework, vydané na podzim spolu s VisualStudio Whidbey.
 

October 2004 Community Technical Preview Release Readme
Read about the know issues with the October 2004 Community Technical Preview. Please read this document carefully before installing the preview.   
Visual Basic 2005 Express Edition Community Technical Preview
Download the Visual Basic 2005 Express Edition Community Technical Preview.   
Visual C# 2005 Express Edition Community Technical Preview
Download the Visual C# 2005 Express Edition Community Technical Preview.   
Visual C++ 2005 Express Edition Community Technical Preview
Download the Visual C++ 2005 Express Edition Community Technical Preview.   
Visual J# 2005 Express Edition Community Technical Preview
Download the Visual J# 2005 Express Edition Community Technical Preview.   
Visual Web Developer 2005 Express Edition Community Technical Preview
Download the Visual Web Developer 2005 Express Edition Community Technical Preview. 
NET Framework 2.0 SDK Beta 1 x86 (32 Bit)
The Microsoft® .NET Framework Software Development Kit (SDK) version 2.0 includes everything developers need to write, build, test, and deploy .NET Framework applications—documentation, samples, and command-line tools and compilers. You must install the .NET Framework Redistributable Package version 2.0 prior to installing the .NET Framework SDK.   
. NET Framework Version 2.0 Redistributable Package Beta 1 x86 (32 Bit)
The Microsoft .NET Framework version 2.0 beta redistributable package is the most recent update to the Microsoft .NET Framework and includes everything you need to run applications developed using the .NET Framework.   
Konečně můžete používat ADODB komponenty, které jsou standardní součástí .NET Frameworku. Přidejte si ve Vašem IDE referenci na
Microsoft.VisualBasic.Compatibility.Data.dll
z adresáře .NET Framework do toolboxu a získáte klasickou komponenty, pracující s ADODB Recordsetem, avšak konzistentní s .NET. To lze doporučit zejména v případě, že hodláte při stránkování využívat serverový kurzor, proacující s datay na serveru. Ukázkový příklad je uveden níže:
 

' vyzaduje zahrnout referenci na 
' Microsoft.VisualBasic.Compatibility.Data.dll
' %ProgramFiles%\Microsoft.NET\Primary Interop Assemblies\ADODB.dll
' %ProgramFiles%\Microsoft.NET\Primary Interop Assemblies\MSDATASRC.dll
Imports System.Drawing, System.Windows.Forms, System.Data, System.Data.OleDb
Imports Microsoft.VisualBasic.Compatibility.VB6
Module modMain
Sub Main()
With New Form
Dim DG As New DataGrid, DT As New DataTable, DC As New ADODC, ODDA As New OleDbDataAdapter
DC.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\Northwind.mdb;"
DC.RecordSource = "Customers": DC.Refresh(): ODDA.Fill(DT, DC.Recordset)
With DG
.Location = New Point(20, 20): .Size = New Size(500, 400): .Anchor = 15 : .CaptionText = "Northwind"
.DataSource = DT
End With
.ClientSize = New Size(550, 450): .StartPosition = 1: .Text = "ADODB.Recordset Databinding Demo"
.Controls.Add(DG): .ShowDialog()
End With
End Sub
End Module

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  24. 10. 2004 15:13  | 

Jelikož Živě neakceptuje pastované odkazy, tak ještě jednou:
 
Bližší informace o použítí ADODB.Recordsetu v prostředí .NET naleznete zde:
 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconfillingdatasetwithadorecordset.asp
 
Odkazy pro stažení posledních (BETA2) verzí Visual Studio Express a .NET Framework 2.0 najdete zde
 
http://lab.msdn.microsoft.com/express
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik help  |  24. 10. 2004 16:43  | 

Diky mnohokrat !!
Skusim cesky - klobouk dolu !

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  03. 11. 2004 02:50  | 

Ohledně pamětově úsporného stránkování Datasetu vyšel před časem článek na Interval.cz - doporučují jej Vaší pozornosti.
 
http://interval.cz/clanek.asp?article=3174
 
 

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor
Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky