Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Ongelmia DLL:n käytössä

aleczz [26.06.2008 10:53:37]

#

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.

Anthaing [30.06.2008 01:36:22]

#

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

aleczz [02.07.2008 17:21:29]

#

Ok, kiitän. Pitääpä tutkia miten tätä sovelletaan realbasiciin.

Vastaus

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

Tietoa sivustosta