En olekaan pitkään aikaan udellut mitään vb.net-rintamalla. On sinänsä harmi, että kovin harva sitä vielä taitaa. No, enempiä jaarittelematta, tässä on ongelmani:
Ohjelmassani painettessa nappia soitetaan piipperin kautta korvienrääkkäyssäveliä. No, tämähän on jo toteutettu, mutta jos se halutaankin lopettaa kesken, ongelmat ilmaantuvat. Katsos, kun Beepin pyöriessä ei voikaan klikata stop-nappia. Hiiri kylläkin liikkuu.
'Soittosubi
For j = 0 To Ubound(freq)
If Not stopb Then
Soitin.Soita(freq(j),last(j))
Else
stopb = False
Exit For
End If
NextJa stop-nappi simppelisti asettaa stopb:n trueksi. Mikä tähän auttaa? Säikeet? Apua tarvitaan ja auttajat palkitaan krediiteissä.
Soitin.Soita kutsuu kernel32:n beepiä.
Ilmeisesti siis soitat säveltä uudestaan ja uudestaan aina hetken kerrallaan?
Eikös tuo ole ihan perinteinen DoEventsin paikka? Testasin tällaisella, ja looppi katkesi kyllä, mutta jostakin syystä piti klikata kahteen kertaan Button2:sta:
Private Sub Button1Click(sender As System.Object, e As System.EventArgs) Lopeta = False A = 0 While Lopeta = False 'mukamas loputon silmukka A = A + 1 ' Tähän vaan laitat sen tekemisesi, Me.button1.Text = A ' Soitin.Soita(freq(j),last(j)) Application.DoEvents 'DoEventsin uusi versio End While End Sub Private Sub Button2Click(sender As System.Object, e As System.EventArgs) Lopeta = True 'tällä katkaistaan se silmukka End Sub
Ah, ensimmäinen VB.NET:llä kirjoittamani koodinpätkä! Toivottavasti ei ala ääni pätkiä, DoEvents voi katkaista hetkeksi.
Juice kirjoitti:
On sinänsä harmi, että kovin harva sitä vielä taitaa.
Niin, mikähän kynnys kaikilla on uuden kielen opetteluun? Ei se todellakaan ole iso askel (Ensimmäinen VB.NET-pätkäni, kolmas tai neljäs VB-pätkäni, ja silti väitän osaavani VB.NETiä).
Mikäs ohjelma tuosta oikein tulee?
Kyllähän se katkeaa, mutta tosiaan joutuu painamaan kahteen kertaan. No, kiitos avusta, täytynee keksiä jotakin.
Tosiaan, yhden kielen kun oppii, niin muut ovat lastenleikkiä.
Ohjelmasta tulee osa uutta piipperiprojektiani (toinen käynnissäoleva projekti on se kielijuttu). Tämä on itse soitin, sävellysohjelmakin olisi tarkoitus tehdä. Täytynee kuitenkin ensin saada timmiin kuntoon tämä soitin :)
Antti hoi, VBKoodi syö kaikki tabulaattorit! Korvasin spaceilla.
Imports System
Imports System.Drawing
Imports System.Threading ' Täältä löytyvät säikeet
Imports System.Windows.Forms
Namespace VBKoe
Public Class MainForm
Inherits System.Windows.Forms.Form
Private T As Thread ' Säie
Private A As Integer
' Nappeja
Private Jatka As System.Windows.Forms.Button
Private Aloita As System.Windows.Forms.Button
Private Lopeta As System.Windows.Forms.Button
Public Shared Sub Main
Dim fMainForm As New MainForm
fMainForm.ShowDialog()
End Sub
Public Sub New()
MyBase.New
Me.InitializeComponent
T = New Thread(AddressOf Me.Silmukka)
T.Start ' Käynnistetään säie, se aloittaa heti työnsä
End Sub
'****************************************
' Windows Forms Designer Generated Code *
'****************************************
' Tätä säie jauhaa
Private Sub Silmukka
Alku:
' Suspend on alussa, koska ensimmäisellä kerralla
' (T.Start) ei tarvitse oikeasti tehdä mitään.
T.Suspend
' Tässä tehdään jotain
While A < 10000
A = A + 1
Me.Text = A
End While
GoTo Alku ' Ja sitten palataan alkuun ja nukkumaan
End Sub
Private Sub AloitaClick(sender As System.Object, e As System.EventArgs)
T.Suspend ' Nukutetaan varmuuden vuoksi
A = 0 ' Merkitään, että thread saa mennä alkuun
T.Resume ' ja herätetään
End Sub
Private Sub LopetaClick(sender As System.Object, e As System.EventArgs)
T.Suspend ' Nukutetaan säie
End Sub
Private Sub JatkaClick(sender As System.Object, e As System.EventArgs)
T.Suspend ' Nukutetaan varmuuden vuoksi
T.Resume ' ja herätetään
End Sub
' Formin sulkeminen, tapetaan säie
Private Sub MainFormClosing(sender As System.Object, e As System.ComponentModel.CancelEventArgs)
T.Suspend ' Ja lopuksi tietenkin tapetaan säie:
T.Resume ' Nukutus, herätys ja Abort
T.Abort
End Sub
End Class
End NamespaceKaikkeen sitä ryhtyy, jos sillä välttyy tekemästä läksyjä :D
Siinä on siis ohjelma, joka laskee ikkunan yläpalkissa 0:sta 10000:een, kun painetaan aloitusnappia. Toteutustapana säikeet. Lopetusnappi keskeyttää laskennan, aloitus aloittaa alusta ja jatkaminen jatkaa siitä, mihin on jääty. Tarvitset formin, jolla nuo nappulat sijaitsevat, ja InitializeComponent-Subin, joka asettelee napit paikoilleen. Tuon ratkaisun mahdollinen riski piilee siinä, että Suspendissa suoritus saattaa pysähtyä jotenkin eri paikkaan kuin olisi suotavaa... En tiedä.
No, jotakin tällaista olinkin pyöritellyt päässäni ja sainkin jopa toimimaan. Suuret kiitokset. Nyt visualizerin kimppuun \o/
Metabolix kirjoitti:
Kaikkeen sitä ryhtyy, jos sillä välttyy tekemästä läksyjä :D
Niin totta, niin totta. Pätee myös kokeisiin lukemiseen :)
Niin ja tutkielmien tekemiseen. Tässä just oon yhtäkin "tekemässä", eli lueskelen Ohjelmointiputkan foorumia. :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.