Auf OpenNetworkConnection warten?

Für allgemeine Fragen zur Programmierung mit PureBasic.
pogi02
Beiträge: 131
Registriert: 30.10.2004 00:52
Wohnort: Österreich
Kontaktdaten:

Auf OpenNetworkConnection warten?

Beitrag von pogi02 »

Hallo


Also ich habe folgendes vor:

Ich will solange das Programm versucht per OpenNetworkConnection eine Verbindung herzustellen ein Fenster anzeigen lassen das eine animation hat und sobald OpenNetworkConnection eine Rückgabe gemacht hat also 0 für keine Verbindung oder eben die ID das Fenster schliessen und ein anderes öffnen!

Doch wie kann ich denn Checken ob bereits eine Rückgabe gemacht worden ist?

Wenn ich es in eine Schleife packe Hängt das Fenster bis eine Verbindung da ist oder auch nicht und wenn ich einen Thread mache geht es zwar das das Fenster nicht wartet aber ich bekomme nen falschen Rückgabe wert da es sofort 0 zurückgibt

Hat jemand eine Lösung? Ich hoffe ihr versteht einigermassen was ich meine
MfG pogi02

- www.apware.net
Aktuelles Projekt:
-
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

Code: Alles auswählen

EnableExplicit
; Compileroption: Threadsave ON
Global Fertig.l

Procedure warten(dummy.l)
  Protected tmp.l
  If OpenWindow(0,0,0,100,20,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess)
    If CreateGadgetList(WindowID(0))
      ProgressBarGadget(0,0,0,100,20,0,100)
      Repeat
        Delay(10)
        WindowEvent()
        If tmp <= 100
          tmp + 1
        Else
          tmp = 0
        EndIf
        SetGadgetState(0,tmp)
      Until Fertig
      CloseWindow(0)
    EndIf
  EndIf
EndProcedure

CreateThread(@warten(),0)
; Hier dein Network - warten - code
; simuliert durch ein delay()
Delay(5000)
; wenn fertig: setzte "Fertig" auf #True
Fertig = #True
;Programm zum testen noch etwas laufen lassen
Delay(2000)
MessageRequester("","end")
Wichtig:
- Threadsave sollte an sein, da sons Speicherverletzungen auftreten können
- Das Öffnen eins Fenster und das Bearbeten der Events darf nicht auf verschiedene Threads verteilt werden.
- Wärend ein Windows-Thread läuft ist von dem parralelen erstellen eines Anderen Windows abzuraten.
generell sollte sowieso nur eien Eventschleife in einem Programm sein, eventuell das Connecten in einen Thread packen und mit "IsThread()" abfargen (in etwa HeX0Rs Beispiel weiter unten)

//edit: @ threadsave:

Dieses Beipiel hat bei mir auch ohne Threadsave funktioniert.
Und ich hatte mit Threadsave bei PB noch nie Probleme (ALLE meine Programme haben Threadsave aktiviert)
Zuletzt geändert von a14xerus am 20.07.2007 19:51, insgesamt 1-mal geändert.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Threadsave sollte an sein, da sons Speicherverletzungen auftreten können
Wenn PureBASIC dabei vollständig funktionieren würde... :roll:
Bild
pogi02
Beiträge: 131
Registriert: 30.10.2004 00:52
Wohnort: Österreich
Kontaktdaten:

Beitrag von pogi02 »

Naja so wie ich es gemacht habe hats eigentlich auch funktioniert nur hab ich depp imer den falschen port angegeben xD

Deswegen sagte der Router "NEIN zum Euromilionenspiel" xD Funktioniert hats aber ich konnte nicht verbinden eben wegen dem Router und deswegen hab ich immer 0 zurückbekommen bei OpenNetworkConnection

Naja war ein blöder fehler aber thx trotzdem für die Hilfe
MfG pogi02

- www.apware.net
Aktuelles Projekt:
-
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Das geht auch ohne Threadsafe-Option:

Code: Alles auswählen

InitNetwork()

Procedure ConThread(*ConID.LONG)
  
  *ConID\l = OpenNetworkConnection("www.gibtsgarnicht.de", 12345)

EndProcedure

Procedure Warten()
	Protected ConID.l = -1, Delay.l = 10, ThreadID.l, Counter.l
	
	If OpenWindow(0, 0, 0, 150, 50, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
		ProgressBarGadget(0, 0, 0, 148, 20, 0, 100, #PB_ProgressBar_Smooth)
		TextGadget(1, 0, 25, 148, 20, "Verbinde...", #PB_Text_Center)
		
		ThreadID = CreateThread(@ConThread(),@ConID)
		Repeat
			Select WaitWindowEvent(Delay)
				Case #PB_Event_CloseWindow
					If IsThread(ThreadID)
						KillThread(ThreadID)
					EndIf
					Break
				Case 0
					If Delay = 10
						If ConID = 0
							SetGadgetState(0, 0)
							SetGadgetText(1, "Keine Verbindung!")
							Delay = -1
						ElseIf ConID <> -1
							SetGadgetState(0, 100)
							SetGadgetText(1, "ConID:" + Str(ConID))
							Delay = -1
						Else
							SetGadgetState(0, Counter)
							Counter + 1
							If Counter > 100
								Counter = 0
							EndIf
						EndIf
					EndIf
			EndSelect
		ForEver
	EndIf
EndProcedure

Warten()
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Dieses Beipiel hat bei mir auch ohne Threadsave funktioniert.
Und ich hatte mit Threadsave bei PB noch nie Probleme (ALLE meine Programme haben Threadsave aktiviert)
Freut mich für dich :D
Bei mir isses so, wenn ich bei einem "fertigen" Projekt mit Threads nun plötzlich Threadsave aktiviere bekomm ich einen POLINK Error nach dem anderen :?
Bild
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

komisch.
Ich glaube du benutzt Libs die kein Threadsave unterstützen.
Ich habe nur PBOSL "installiert" und benutze ansonsten nur includes
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Das wäre natürlich gut möglich...


Ich bekomme unter anderem als erstes einen Fehler als Unresolved external Symbol '_PB_StringBasePosition'.
Falls damit irgendwer was anfangen kann^^
Bild
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

Jilocasin hat geschrieben:Ich bekomme unter anderem als erstes einen Fehler als Unresolved external Symbol '_PB_StringBasePosition'.
Falls damit irgendwer was anfangen kann^^
You are using a non threadsafe library or using incorrectly a threadsafe library version.
For example, my libraries usually exist in several versions :
- the standard version, located in %Purebasic%\PureLibraries\UserLibraries\ ;
- the thread-safe version, located in %Purebasic%\SubSystems\UserLibThreadSafe\PureLibraries\ .
- the unicode version, located in %Purebasic%\SubSystems\UserLibUnicode\PureLibraries\ .
- the unicode + thread-safe version, located in %Purebasic%\SubSystems\UserLibunicodeThreadSafe\PureLibraries\ .
In order to use this library in thread-safe mode (compiler option /THREAD), you have to enable the subsystem 'UserLibThreadSafe'
in the PB IDE, or add '/SUBSYSTEM UserLibThreadSafe' to the PBCompiler arguments. In jaPBe, do nothing : it will automatically
enable the 'UserLibThreadSafe' subsystem to use the threadsafe versions of the installed userlibraries.
It's the same logic for unicode and unicode + thread-safe modes.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

aha..
Ich dachte immer PB(IDE) nimmt automatisch die richtige Lib..
Naja ich benutze sowieso jaPBe ;)
Antworten