Rapi2 & threading

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • trees
  • Registratie: November 2010
  • Laatst online: 07:28
Dag allemaal,

ik ben een programma aan het maken om gegevens te kopiëren naar een mobile device. Zonder threading werkt dit perfect via RAPI2, maar vermits ik vrij grote files kopieer lijkt het soms of mijn programma 'freezed'

De belangrijkste lijnen code, dit is een vb van gewoon een create directory:
code:
10
11
12
13
Public dev As RemoteDevice
Public mgr As New RemoteDeviceManager
dev = mgr.Devices.FirstConnectedDevice
createDirectoryOnDevice("\Application\Testing")

code:
10
11
12
13
14
15
16
17
Private Sub createDirectoryOnDevice(ByVal dir As String)
        If Not RemoteDirectory.Exists(dev, dir) Then
            RemoteDirectory.CreateDirectory(dev, dir)
            lvStatus.Items.Add(dir.Substring(dir.LastIndexOf("\") + 1) + " directory created")
        Else
            lvStatus.Items.Add(dir.Substring(dir.LastIndexOf("\") + 1) + " directory already exists")
        End If
    End Sub


zoals gezegd werkt dit op zich wel, al leek het mij (met mijn beperkte kennis) beter om threading toe te passen, zodat ik bv een progress bar kan laten lopen zolang de verwerking bezig is..
Mijn idee was:
code:
10
11
12
13
14
        Dim obj(1) As Object
        obj(0) = dev
        obj(1) = "\Application\Testing"
        Dim createdir As New Thread(AddressOf createDirectoryOnDevice)
        createdir.Start(obj)

code:
10
11
12
13
14
15
16
17
18
19
20
    Private Sub createDirectoryOnDevice(ByVal objdir As Object)
        Dim device As RemoteDevice = objdir(0)
        Dim dir As String = objdir(1)

        If Not RemoteDirectory.Exists(device, dir) Then
            RemoteDirectory.CreateDirectory(device, dir)
            lvStatus.Items.Add(dir.Substring(dir.LastIndexOf("\") + 1) + " directory created")
        Else
            lvStatus.Items.Add(dir.Substring(dir.LastIndexOf("\") + 1) + " directory already exists")
        End If
    End Sub

Bij het uitvoeren van dit programma krijg ik de melding: Interface not registred, vermits hij volgens mij in de thread geen verbinding heeft met dit remotedevice..

Iemand die me een duwtje in de rug kan geven voor een oplossing? Moet daarom niet met threading, zolang de gebruiker maar niet de indruk heeft dat het programma vast loopt :)

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Azer
  • Registratie: Oktober 2003
  • Niet online
Ik zou eens kijken naar een backgroundworker in plaats van een thread. Hiermee kan je precies wat je nu wilt en je kan ook nog eens op een makkelijke manier progress teruggeven.
Zie: http://www.dreamincode.ne...05-the-background-worker/

Acties:
  • 0 Henk 'm!

  • trees
  • Registratie: November 2010
  • Laatst online: 07:28
bedankt, ik bekijk dit direct! I'll keep you posted :)

EDIT
Ik heb mijn createdir in mijn DoWork gezet, maar hij lijkt hetzelfde probleem te vertonen:

code:
10
11
12
13
        Dim param_obj(1) As Object
        param_obj(0) = "\Application\Test"
        param_obj(1) = dev
        bgwCreateDir.RunWorkerAsync(param_obj)

code:
10
11
12
Private Sub bgwCreateDir_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwCreateDir.DoWork
        Dim mdev As RemoteDevice = e.Argument(1)
    End Sub


Geeft hetzelfde probleem bij de remotedevice.. Of bekijk ik het helemaal verkeerd?

[ Voor 85% gewijzigd door trees op 30-12-2011 09:55 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 11-10 10:35
Ik weet niet precies wat er gebeurd in die RAPI2 lib die je gebruikt. Maar ik kan me voorstellen dat je op een of andere manier een SecurityContext opzet (aka, vaststellen wie jij bent en welke rechten je hebt, al dan niet impliciet).

Zou het kunnen dat deze context per thread wordt bijgehouden? Dat je daarom een foutmelding krijgt? Of wellicht word er iets anders per thread bijgehouden in die api, waardoor je deze fout krijgt.
Dit is in ieder geval de enigste verklaring die ik je zou kunnen geven voor het gedrag wat je hier ziet.

Je kan ook de gehele rapi aanroep in de background worker uitvoeren, en je main applicatie puur de voortgang rapportage af te laten handelen.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit issue wordt ook hier beschreven: http://rapi2.codeplex.com/discussions/65574 Negeer in ieder geval de opmerking daar dat BackgroundWorker ThreadPool-threads gebruikt, dat is onzin.

Kun je niet gewoon je object maar in 1 thread maken/gebruiken? Dat lijkt mij wel zo netjes. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten