libusb ausstehende bulktransfers beenden, aber wie?

Gast #2770323
Lesenswert?

Mahlzeit

Ich hab leider nochmal ein Problem bei dem mir die libusb und libusbJava 
doku nicht weiterhilft.
Wenn ich LibusbJava1.libusb_close(usbHandle); aufrufe, während noch 
bulktransfers ausstehen, werden die ausstehenden transfers nicht 
beendet, bulktransfers mit timeout blockieren sogar dauerhaft, anstatt 
eine Timeout exception zurückzugeben.
Auf welche Weise beende ich einen bulktransfer wenn das Device (aus 
welchen Gründen auch immer) die Daten des transfers nicht empfängt oder 
sendet?
Hier mal ein vereinfachter Codeausschnitt  um mein Problem zu 
veranschaulichten:
1
if (usbHandle = device.open()) 
2
      {
3
        Thread t = new Thread() 
4
        {
5
          public void run() 
6
          {
7
            try
8
            {
9
              int length = 4;
10
              byte[] data = new byte[5];
11
              LibusbJava1.libusb_bulk_transfer(usbHandle, (byte) 0x1, data , length , 0);
12
            } catch (Exception e) {
13
              e.printStackTrace();
14
            }
15
          };
16
        };
17
        t.start();
18
        threadVector.add(t);
19
      }
20
      try {
21
        Thread.sleep(2000);
22
      } catch (InterruptedException e) {
23
        // TODO Auto-generated catch block
24
        e.printStackTrace();
25
      }
26
      LibusbJava1.libusb_close(usbHandle);
27
      EfmUsbService.exit();
Viele Grüsse
Chris
Gast #2770655
Lesenswert?

Problem hat sich quasi erledigt, ausser das ich noch nicht ganz sicher 
bin wie mein Workaround aussehn wird.
http://sourceforge.net/mailarchive/forum.php?thread_name=20120726142729.8498.qmail%40stuge.se&forum_name=libusb-devel
leider ist die Antwort nicht sehr zufriedenstellend.
"The C library does not cancel transfers when libusb_close() is called, 
and on the other hand libusb_close() does not wait until all transfers 
have been completed but closes the device immediately - so the transfers 
will never complete. The application has to clean up all transfers 
before calling libusb_close().
When using the synchronous API there's no way to cancel a transfer."


@Jörg Wunsch
dank für den Hinweis, ich werde mal testen was passiert, aber da die 
close funktion keine ausstehnden Transfers beendet, bezweifel ich dass 
die reset funktion dies macht. Wir werden sehn

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren