Auf OpenNetworkConnection warten?
Auf OpenNetworkConnection warten?
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
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
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")
- 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.
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
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
- 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:
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()
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Freut mich für dichDieses Beipiel hat bei mir auch ohne Threadsave funktioniert.
Und ich hatte mit Threadsave bei PB noch nie Probleme (ALLE meine Programme haben Threadsave aktiviert)

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

You are using a non threadsafe library or using incorrectly a threadsafe library version.Jilocasin hat geschrieben:Ich bekomme unter anderem als erstes einen Fehler als Unresolved external Symbol '_PB_StringBasePosition'.
Falls damit irgendwer was anfangen kann^^
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).