[ Anestetik @ 05.06.2011. 15:37 ] @
Interesuje me kako se izvrsavaju petlje u vb, jer je ocito iz ovog primera da on ne ide redom kroz petlju i resava liniju po liniju, evo primer:


Code:
Dim a As Single
Dim b As Single

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1
End Sub

Private Sub Command1_Click()
Timer1.Enabled = True
    For b = 1 To 1000000
        Label1.Caption = b
    Next b
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
a = a + 1
Label2.Caption = a
End Sub


On uopste ne ukljuci Timer kontrolu, zasto?
[ Marko_L @ 05.06.2011. 15:57 ] @
Zato što odmah po uključenju tajmera pokrećeš petlju koja zakuca procesor i onda timer ne stigne da se trigeruje. Ima više rešenja. Jedno je da dodaš DoEvents u petlju
Code:
Private Sub Command1_Click()
Timer1.Enabled = True
    For b = 1 To 1000000
        DoEvents
        Label1.Caption = b
    Next b
Timer1.Enabled = False
End Sub

Ovo će usporiti samu petlju, ali će se izvršiti sve što treba. E sad, ne znam koja je svrha korišćenja timera ovde, ali predpostavljam da želiš da izmeriš koliko vremena je potrebno petlji da se izvrši u milisekundama. Ako je tako, to se može uraditi na lakši, tačniji i efikasniji način, korišćenjem GetTickCount funkcije. Naravno, moraš prvo da je deklarišeš.
Code:
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Dim b As Single

Private Sub Command1_Click()
    Dim lTimeStarted As Long
    Dim lTimeFinished As Long
    
    lTimeStarted = GetTickCount()
    
    For b = 1 To 1000000
        Label1.Caption = b
    Next b

    lTimeFinished = GetTickCount()

    Label2.Caption = lTimeFinished - lTimeStarted
End Sub
[ Anestetik @ 05.06.2011. 16:57 ] @
Ovo je samo bio primer, a mene zapravo zanima kako da VB izvrsava kod u petlji, a zapravo me interesuje kako da svojoj aplikaciji dadnem prioritet u odnosu na druge aplikacije koje OS trenutno izvrsava.
[ Marko_L @ 05.06.2011. 17:56 ] @
Pa upravo tako kako si uradio. Ako šibneš petlju bez DoEvents-a, tvoja aplikacija će sebično zauzeti sve resurse koje može. Naravno, to nije dobra praksa, jer korisnici nikako ne vole aplikacije koje ih onemogućavaju da rade bilo šta drugo, pogotovo kada puste obradu nekih podataka, za šta petlje najčešće i služe, a za to vreme žele da obave nešto drugo.
[ Shadowed @ 05.06.2011. 19:36 ] @
Pa, nije bas tako.. Petlja bez DoEvents ce zakociti samo njegovu aplikaciju, tacnije, trenutnu nit. Ostale aplikacije ce biti pod uticajem ali nece biti da ne moze nista drugo da radi. O tome se brine Windows. A na procesorima iz poslednjih nekoliko godina (sa vise od jednog jezgra) cak nece ni predstavljati neki problem jer ce se druga aplikacija izvrsavati na drugom jezgru.
E sad, kao dodatak na ovo, svaki proces ima svoj prioritet u windows-u. To se moze videti i menjati u task manager-u. Takodje se moze menjati i iz sopstvenog programa nekmo API funkcijom, ali ne znam napamet kojom :)
[ Marko_L @ 05.06.2011. 20:16 ] @
Moguće. Kada sam prešao na višejezgarne procesore, prešao sam i na .NET, pa ne znam kako se VB classic ponaša na njima, ali koliko se sećam, velike petlje su na single procesorima itekako mogle da zauzmu resurse, što može poprilično da oteža (uspori) korišćenje drugih aplikacija. Ali, u pravu si, o tome brine Windows, tako da se podešavanjem prioriteta može namestiti da VB aplikacija gotovo i ne utiče na ostale aplikacije. Inače, API funkcija kojom se to radi je SetPriorityClass

Primer iz API Guide-a:
Code:
Const THREAD_BASE_PRIORITY_IDLE = -15
Const THREAD_BASE_PRIORITY_LOWRT = 15
Const THREAD_BASE_PRIORITY_MIN = -2
Const THREAD_BASE_PRIORITY_MAX = 2
Const THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
Const THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
Const THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
Const THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
Const THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
Const THREAD_PRIORITY_NORMAL = 0
Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
Const HIGH_PRIORITY_CLASS = &H80
Const IDLE_PRIORITY_CLASS = &H40
Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100
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 GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function GetPriorityClass Lib "kernel32" (ByVal hProcess As Long) As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: [email protected]
    Dim hThread As Long, hProcess As Long
    'retrieve the current thread and process
    hThread = GetCurrentThread
    hProcess = GetCurrentProcess
    'set the new thread priority to "lowest"
    SetThreadPriority hThread, THREAD_PRIORITY_LOWEST
    'set the new priority class to "idle"
    SetPriorityClass hProcess, IDLE_PRIORITY_CLASS
    'print some results
    Me.AutoRedraw = True
    Me.Print "Current Thread Priority:" + Str$(GetThreadPriority(hThread))
    Me.Print "Current Priority Class:" + Str$(GetPriorityClass(hProcess))
End Sub
[ Anestetik @ 06.06.2011. 16:44 ] @
Vidim da ste znalci pa da postavim jedno teze pitanje:

Da li je moguce da ja iz task bara pogasim sve procese, a da ostavim samo proces moje aplikacije, tj. da li bi moja aplikacija tada radila?

I ako nije moguce, koje je to procese potrebno ostaviti a da ona nastavi da radi?

Napomena: Meni nije potrebno nista od windowsa za vrijeme izvodjenja moje aplikacije (ni desktop, ni startmeny, internet... i sl.) vec samo moja aplikacija i da ona zauzme sto vise resursa procesora tj da se sto brze odvija.
[ Shadowed @ 06.06.2011. 17:23 ] @
Poiskljucuj sve servise koji ti nisu potrebni i to je otprilike to. Ostalo cimanje ti nece doneti vise od 1-3% ustede. A i to je pitanje. A mozes i pokrenuti dodatno windows u safe mode-u.