Moro
Olen tällä hetkellä koodaamassa mp3-ripperiä. Sen user interface on toteutettu RealBasicilla mutta se on hyvin lähellä Visual Basicia joten Visual Basicin koodia voidaan helposti soveltaa RealBasiciin. Kaikki muut osat onkin sitten dll:ssä, joka on muokattu c:llä toteutettu akrip- kirjasto.
Ongelma koskee dll:n käyttöä jota kutsun declarella ui:stä. Tällä hetkellä dll:n funktiokutsu ripCD() jumittaa basicilla toteutetun interfacen niin pitkäksi aikaa kun funktio palauttaa arvon, eli esim cd-levyä ripatessa tähän menee usea minuutti.
Miten on mahdollista saada basic sovellus päivittämään itsensä samaan aikaan?
Ui:n päivitys tapahtuu ainoastaan jos käyttää dll:ssä esim messageboxia joka ilmoittaa jotain tietyin ajanjaksoin. Tämä ongelma viittaa mielestäni dll-kirjaston koodiin joka on toteutettu c:llä, mutta luultavasti jollain muullakin jonkin basicin käyttäjällä on tullut sama ongelma eteen joskus ja osaa näin vastata paremmin kuin pelkät c:n käyttäjät.
Yksi tapa olisi luoda uusi säie ajamaan tuota ripCD()-kutsua, jolloin Basic-ohjelman suoritussäie voisi jatkaa käyttöliittymän päivitystä. Jos säikeen luo Basic-ohjelman puolella, voi ripCD():n edistymistä kysellä vaikka Timer-kontrollilla. Visual Basic 6:lla sen voisi tehdä jokseenkin näin:
Declare Function CreateThread lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long Declare Function CloseHandle lib "kernel32" (ByVal hObject As Long) As Long ' Globaaleissa Private kahva As Long ' Säikeen kahva Private id As Long ' Säikeen id; ei tarvita tässä Private lippu As Boolean ' Kertoo, milloin ripCD() on palannut ' Joku tapahtuma tai muu, josta ripCD()-kutsu aiheutuu: Sub x() lippu = False ' Uusi säie kutsuu ripCD():tä kahva = CreateThread(0&, 0&, AddressOf VBRipCD, 0&, 0&, id) If kahva = 0& Then ' Virhe End If End Sub Function VBRipCD(ByVal lpData As Long) As Long lippu = True ' Suoritus on vielä kesken Timer1.Enabled = True ' Aloita kyselemään suorituksen tilaa ' Kutsu ripCD():tä ripCD(...) ' Ilmoita, että funktio on valmis, ja täytyy siivota jäljet. lippu = False ' Palauta jotain VBRipCD = 1 End Function Private Sub Timer1_Timer() ' Sulje ajastin ja tuhoa säie, joka on luultavasti jo palannut. If lippu Then Exit Sub Call CloseHandle(kahva) kahva = 0& id = 0& Timer1.Enabled = False End Sub
Ok, kiitän. Pitääpä tutkia miten tätä sovelletaan realbasiciin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.