Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Beep varastaa fokuksen - säikeetkö apuun?

Juice [08.03.2005 19:29:40]

#

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
Next

Ja 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ä.

Metabolix [08.03.2005 20:04:46]

#

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?

Juice [08.03.2005 20:48:05]

#

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 :)

Metabolix [08.03.2005 21:57:27]

#

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 Namespace

Kaikkeen 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ä.

Juice [08.03.2005 22:14:51]

#

No, jotakin tällaista olinkin pyöritellyt päässäni ja sainkin jopa toimimaan. Suuret kiitokset. Nyt visualizerin kimppuun \o/

Blaze [08.03.2005 22:20:35]

#

Metabolix kirjoitti:

Kaikkeen sitä ryhtyy, jos sillä välttyy tekemästä läksyjä :D

Niin totta, niin totta. Pätee myös kokeisiin lukemiseen :)

dooDle [09.03.2005 22:43:38]

#

Niin ja tutkielmien tekemiseen. Tässä just oon yhtäkin "tekemässä", eli lueskelen Ohjelmointiputkan foorumia. :D

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta