Seite 1 von 2

CreateThread()

Verfasst: 20.01.2007 20:03
von X-prt
Es ist einfach nur ein Test.
Ich hab mir gedacht wenn ich das ganze über Threads mache, öffnen sich die beiden laufwerke fast gleichzeitig.

wieso läuft das nicht?
wenn ich die funktion über die auskommentierte Zeile aufrufe gehts.

Code: Alles auswählen

InitAudioCD()
Structure Laufwerk_struct
  Laufwerk.b
  State.b
EndStructure
Procedure Laufwerk(*Instruct.Laufwerk_struct)
  UseAudioCD  (*Instruct\Laufwerk)
  EjectAudioCD(*Instruct\State)
EndProcedure

Ins.Laufwerk_struct
For i=0 To 1
  Ins\Laufwerk=i
  Ins\State=1
  CreateThread(@Laufwerk(),@Ins)
;  Laufwerk(@Ins)
  Delay(100)
Next
Repeat
  Delay(1)
Until GetAsyncKeyState_(#VK_ESCAPE)

Verfasst: 20.01.2007 20:08
von Vallan
Villeicht hat MS Threads den Zugriff auf die Lauferke nicht erlabut. Vieles anderes ist ja auch verboten.

Verfasst: 20.01.2007 20:10
von ts-soft
Wenn Du ThreadSafe in den Compileroptionen einstellst, geht es
(aber wahrscheinlich so schnell wie ohne Threads)

Verfasst: 20.01.2007 20:14
von X-prt
hmm... hab auf Threadsicheres ausführen eingestellt aber es ändert sich dadurch garnichts

Verfasst: 20.01.2007 20:18
von ts-soft
Bei mir jetzt auch nicht mehr :freak:

Verfasst: 20.01.2007 20:18
von Marvin
Ich kann mir auch nix vorstellen (ich hab ja auch nur ein DVD-Laufwerk :wink: ), aber probier vlt. mal das hier:

Code: Alles auswählen

InitAudioCD()
Structure Laufwerk_struct
  Laufwerk.b
  State.b
EndStructure
Procedure EjectLaufwerk(LW)
  UseAudioCD(LW)
  EjectAudioCD(1)
EndProcedure

For i=0 To 1
  CreateThread(@Laufwerk(),i)
;  Laufwerk(@Ins)
  Delay(100)
Next
Repeat
  Delay(1)
Until GetAsyncKeyState_(#VK_ESCAPE)
vlt. klappt dass mit den Pointern nicht so recht... :|

Verfasst: 20.01.2007 20:23
von X-prt
doch doch die werte hab ich schon über nen debug in der Prozedur ausgegeben die passen alle.

der code läuft auch ned (auch wenn man die bei CreateThread den prozedurnamen korrigiert :D ), du hast ja den code selbst nicht getestet :lol:

Verfasst: 20.01.2007 20:31
von ts-soft
Ich habs noch nie erlebt, das sich 2 CD-Laufwerke gleichzeitig öffnen, immer
nacheinander. Deswegen sollte das mit dem Thread eingentlich Wurscht sein,
der Code ist ja schon viele viele Zeilen weiter, wenn das erste Laufwerk offen
ist.

Verfasst: 20.01.2007 20:35
von X-prt
jap schon, es ist jetzt auch nicht wichtig für irgend ein Projekt oda so.
aber des wundert mich eben dass das nicht geht. ich kann in dem thread gar kein laufwerk öffnen :( . Jetz gehts mir nicht mehr ums gleichzeitig sondern ums überhaupt.

evtl. hat ja auch Vallan recht... des weis ich ned

Verfasst: 21.01.2007 00:37
von Toshy
hmm.

Code: Alles auswählen

EjectAudioCD(*Instruct\State) 
scheint innerhalb des Threads den I/O-Fehler 303 auszugeben (Fehler beim Schreiben). Ich vermute jedenfalls, daß der Rückgabewert dies bedeutet.
Warum das so ist, keine Ahnung. Vielleicht hat PB in Threads damit probleme, ich kann diesen Code z.b. nicht als Unicode kompelieren (nur zum test) weil der Kompiler dann meckert.

Ich weiß ja nicht, ob PB intern MCI oder DirectX für das Öffnen nutzt oder so, aber es gibt bei Threads ja Einschränkungen vom Microsoft. Vielleicht darf man dies einfach nicht in Threads nutzen (wie auch DirektX).

[edit]
PureBasic - Thread - Einleitung
Hinweis: Threads müssen vorsichtig benutzt werden, da es möglich ist, dass Sie gleichzeitigen Zugriff auf geteilte (shared) Ressourcen (Speicher, Variablen, Dateien, etc.) haben und Sie dann manuell sicherstellen müssen, deshalb nicht in Konflikte zu geraten. Die Mutex-Befehle in dieser Library können verwendet werden, um den Zugriff auf solche geteilten Ressourcen zu synchronisieren.

Hinweis: Benutzen Sie innerhalb von Threads kein DirectX (MS Windows Einschränkung)! Wenn Sie auf Grafikdarstellung in Threads angewiesen sind, verwenden Sie stattdessen Images und 2DDrawing.
Das der Speicherbereich deiner Struktur eh nicht sicher läuft, da ein Thread diesen auslesen kann und der andere ihn gerade ändert bin ich nicht eingegangen, da dies nicht der Auslöser des Problems ist.
[/edit]

Versucht es doch mal zum Test direkt über die API mit MCI.

Toshy