Laden...

[gelöst] API-Funktionsauf GetVolumeInformation abbrechen / timeout

Erstellt von userid12392 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.320 Views
U
userid12392 Themenstarter:in
36 Beiträge seit 2008
vor 14 Jahren
[gelöst] API-Funktionsauf GetVolumeInformation abbrechen / timeout

Hallo cSharper,

wenn ich die API-Funktion GetVolumeInformation für ein Volume aufrufe das nicht bereit ist ( z.B. CD/DVD oder Floppy) kann es lange dauern, bis die Funktion zurückkehrt.

Wie kann ich da einen Abbruch oder Timeout programmieren ?

Gruß

Michael Schmitz

3.511 Beiträge seit 2005
vor 14 Jahren

In dem du den Aufruf in einen extra Thread verlagerst.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

3.971 Beiträge seit 2006
vor 14 Jahren

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

U
userid12392 Themenstarter:in
36 Beiträge seit 2008
vor 14 Jahren

Hallo kleines_eichhoernchen,

ich habe es mit der zweiten von Dir genannten Variante ( mit dem Thread-Objekt und dem Aufruf von Thread.Abort ) gemacht.

Funktioniert wunderbar.

Danke.

Michael Schmitz

3.971 Beiträge seit 2006
vor 14 Jahren

Ich würde an deiner Stelle das erste Beispiel mit dem ThreadPool verwenden. Grund, es wird erst eine ThreadAbortException geschmissen, wenn der aktuelle Thread sich in managed Code befindet. WINAPI-Funktionen sind allerdings unmanaged Code und die CLR kann dort den Thread nicht abbrechen, der Thread wird erst abgebrochen, sobald dieser von unmanaged in managed Code zurückkehrt.

Weiterhin macht ein Thread zu erstellen, nur in sehr wenigen Anwendungsfällen sinn, beispielsweise wenn ein Thread sehr lange eine bestimmte Aufgabe erfüllen muss. Bei kurzen kleinen Aufgaben verschlingt die Threaderstellung unnötig viele Ressourcen (Speicher und CPU-Zeit), die andere Threads oder Prozesse besser gebrauchen können.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

U
userid12392 Themenstarter:in
36 Beiträge seit 2008
vor 14 Jahren

Hallo kleines_eichhoernchen,

bei der Variante mit dem ThreadPool habe ich folgendes Problem :

Ich rufe nur eine Funktion auf, kann also keine while(!m_aborted)-Schleife bauen und bin somit darauf angewiesen, nach dem Timeout den Thread mit Thread.Abort abzubrechen. Beim ThreadPool bekomme ich ja keine Referenz auf den gestarteten Thread; oder gibt es da eine Möglichkeit ?

Gruß

Michael Schmitz

3.971 Beiträge seit 2006
vor 14 Jahren

Lass einfach die while-Schleife weg und schreibe nur die entsprechende GetVolumeInformation-Anweisung rein.

Der Thread ist nie über .NET abbrechenbar, da unmanged Code.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...