Seite 1 von 2

Auf OpenNetworkConnection warten?

Verfasst: 18.07.2007 21:04
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

Verfasst: 18.07.2007 21:23
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)

Verfasst: 19.07.2007 21:00
von Jilocasin
Threadsave sollte an sein, da sons Speicherverletzungen auftreten können
Wenn PureBASIC dabei vollständig funktionieren würde... :roll:

Verfasst: 20.07.2007 11:13
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

Verfasst: 20.07.2007 17:40
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()

Verfasst: 21.07.2007 16:20
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 :?

Verfasst: 21.07.2007 16:58
von a14xerus
komisch.
Ich glaube du benutzt Libs die kein Threadsave unterstützen.
Ich habe nur PBOSL "installiert" und benutze ansonsten nur includes

Verfasst: 22.07.2007 15:03
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^^

Verfasst: 23.07.2007 09:40
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.

Verfasst: 23.07.2007 10:48
von a14xerus
aha..
Ich dachte immer PB(IDE) nimmt automatisch die richtige Lib..
Naja ich benutze sowieso jaPBe ;)