CreateThread()

Für allgemeine Fragen zur Programmierung mit PureBasic.
X-prt
Beiträge: 8
Registriert: 15.07.2006 11:51
Kontaktdaten:

CreateThread()

Beitrag 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)
Repeat
MessageRequester("MasterProg","Hallo Welt")
Until True=False
Benutzeravatar
Vallan
Beiträge: 223
Registriert: 20.01.2006 19:34
Kontaktdaten:

Beitrag von Vallan »

Villeicht hat MS Threads den Zugriff auf die Lauferke nicht erlabut. Vieles anderes ist ja auch verboten.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wenn Du ThreadSafe in den Compileroptionen einstellst, geht es
(aber wahrscheinlich so schnell wie ohne Threads)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
X-prt
Beiträge: 8
Registriert: 15.07.2006 11:51
Kontaktdaten:

Beitrag von X-prt »

hmm... hab auf Threadsicheres ausführen eingestellt aber es ändert sich dadurch garnichts
Repeat
MessageRequester("MasterProg","Hallo Welt")
Until True=False
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bei mir jetzt auch nicht mehr :freak:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Beitrag 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... :|
X-prt
Beiträge: 8
Registriert: 15.07.2006 11:51
Kontaktdaten:

Beitrag 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:
Repeat
MessageRequester("MasterProg","Hallo Welt")
Until True=False
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
X-prt
Beiträge: 8
Registriert: 15.07.2006 11:51
Kontaktdaten:

Beitrag 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
Repeat
MessageRequester("MasterProg","Hallo Welt")
Until True=False
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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
Zuletzt geändert von Toshy am 21.01.2007 15:31, insgesamt 1-mal geändert.
1. Win10
PB6.1
Antworten