Seite 3 von 5

Verfasst: 14.07.2007 16:00
von mk-soft
N00B hat geschrieben:Mist :-(

Brauche ein Threadsicheres PB :-(

Somit bringt mir der Code 0 :(
Was hat der Code mit Threadsafe zu tun? -> garnichts.

Für Threadsicheres programmieren gibt es Mutex und die Option
"Thread-sicheres Executable erstellen"

Verfasst: 14.07.2007 16:01
von N00B
Cool ein großes Danke mk-soft :allright:

Da ist der Code ja schon halbwegs pb4 fähig :allright:

Verfasst: 14.07.2007 16:02
von N00B
mk-soft hat geschrieben:
N00B hat geschrieben:Mist :-(

Brauche ein Threadsicheres PB :-(

Somit bringt mir der Code 0 :(
Was hat der Code mit Threadsafe zu tun? -> garnichts.

Für Threadsicheres programmieren gibt es Mutex und die Option
"Thread-sicheres Executable erstellen"
Ja dieser Code nicht, aber ich will ihn ja integrieren in ein Programm das mit mehreren Threads arbeitet.

Das mit Mutex usw hab ich alles schon hingekriegt, wie gesagt ich hänge seit nem halben Jahr nur am Timeout fest :(

Verfasst: 14.07.2007 16:03
von mk-soft
Nicht richtig gelesen?

Mit den Code gehen keine PB Network befehle. Must alles selber Programmieren.

Verfasst: 14.07.2007 16:10
von N00B
OMG

Alles selber ? :freak:

Mein Englisch ist nicht grade das Beste, vor allem beim übern Artikel fliegen. :freak:

Verfasst: 14.07.2007 16:19
von legion
mk-soft hat geschrieben:AMD Athlon(tm) 64 X2 Dual Core Prozessor 4400+

Code läuft nicht unter PB v4.02 aber unter PB v3.94.
Liegt also nicht am Prozessor.
Alles klar !
Habe auf alten Rechner auch ein altes PB.
Darauf hatte ich nicht geachtet.

Lg. Legion

Verfasst: 14.07.2007 16:46
von mk-soft
setsockopt

Mal testen ob es geht.

Code: Alles auswählen

InitNetwork()

Host$ = "www.purearea.net"

ServerID = OpenNetworkConnection(Host$, 80)

; Socket
socket = ConnectionID(ServerID)
time.l = 0
len.l = 4
; Zeiten auslesen - 0 ist wohl defaultwert
Debug getsockopt_(socket,#SOL_SOCKET, #SO_RCVTIMEO, @time, @len)
Debug "Receivetimeout: " + Str(time)
Debug getsockopt_(socket,#SOL_SOCKET, #SO_SNDTIMEO, @time, @len)
Debug "Sendtimeout: " + Str(time)

; Zeit setzen für Receive im millisekunden
time = 100
Debug setsockopt_(socket,#SOL_SOCKET, #SO_RCVTIMEO, @time,@len)
; Zeit überprüfen
time.l = 0
len.l = 4
Debug getsockopt_(socket,#SOL_SOCKET, #SO_RCVTIMEO, @time, @len)
Debug "Receivetimeout: " + Str(time)


If ServerID = 0
  MessageRequester("", "Timeout")
Else
  If SendNetworkString(ServerID, "GET / HTTP/1.1" + #CRLF$ + "Host: " + Host$ + #CRLF$ + #CRLF$)
    Response$   = Space($FFF)
    ResponseLen = Len(Response$)
    Repeat
      inLen = ReceiveNetworkData(ServerID, @Response$ + Pos, ResponseLen - pos)
      Pos + inLen
    Until inLen = 0 Or Pos = ResponseLen
    MessageRequester("", Response$)
  EndIf
  CloseNetworkConnection(ServerID)
EndIf

Verfasst: 14.07.2007 17:12
von DarkDragon
mk-soft hat geschrieben:setsockopt

Mal testen ob es geht.
Hab ich schon vor ein paar Monaten. Das geht definitiv nicht mit connect_(). Da braucht man Non-Blocking-Sockets. setsockopt mit RCV_TIME und SND_TIME oder wie die heißen sind nur für die Pakete nach der Verbindungsherstellung.

Verfasst: 14.07.2007 20:30
von N00B
Ist echt deprimierend, selbst ihr die viel mehr Ahnung vom programmieren haben, finde keine Lösung. :(

All die Zeit und Arbeit die ich in mein Prog gesteckt hab sind umsonst.

Ich wollte ja schon auf Power Basic umsteigen(da kann man das Timeout direkt in ms angeben beim Befehl zum Aufbau einer Verbindung) so verzweifelt bin ich mittlerweile.

Aber das ist der Letzte Mist, um ein Hallo Welt Programm zu erstellen, im Fenster mit nem einfachen OK Button, braucht man zig Winapi Befehle und massig Code.(ich glaub nicht mal mit c++ bräuchte man halb so viel, nur um das Gerüst von einem Fenster mit Button Events zu erstellen)

Dazu keine Handbücher und Einstiegshilfen in Deutsch, geschweige den eine deutschprachige Community.

Und dazu noch ein super saftiger Preis.

130 €

Verfasst: 15.07.2007 08:04
von DarkDragon
Ist nicht ganz sauber, aber es funktioniert (Threadsafe aus mit PB 4.02):

Code: Alles auswählen

; Author: DarkDragon (15.07.2007)

Structure SCONNECT
  host.s
  port.l
  resultConnection.l
  timedout.b
EndStructure

Procedure ConnectThread(*connectData.SCONNECT)
  If *connectData
    *connectData\timedout         = 0
    *connectData\resultConnection = OpenNetworkConnection(*connectData\host, *connectData\port)
    
    If *connectData\timedout = 1 And *connectData\resultConnection <> 0
      CloseNetworkConnection(*connectData\resultConnection)
    EndIf
    
    FreeMemory(*connectData)
  EndIf
EndProcedure

Procedure OpenNetworkConnectionEx(ServerName.s, Port.l, Timeout)
  Protected *connectData.SCONNECT
  Protected startTime.l
  
  *connectData = AllocateMemory(SizeOf(SCONNECT))
  
  *connectData\host = ServerName
  *connectData\port = Port
  *connectData\resultConnection = 0
  *connectData\timedOut         = 0
  
  If CreateThread(@ConnectThread(), *connectData)
    startTime = ElapsedMilliseconds()
    While currentTime < Timeout And *connectData\resultConnection = 0
      Delay(1)
      currentTime = ElapsedMilliseconds() - startTime
    Wend
    
    If *connectData\resultConnection = 0
      *connectData\timedOut = 1
    Else
      ProcedureReturn *connectData\resultConnection
    EndIf
  Else
    FreeMemory(*connectData)
  EndIf
  
  ProcedureReturn 0
EndProcedure

InitNetwork()

Debug "www.hahahahahah13233423.net:80 will timeout (Or someone bought the domain):"
Debug OpenNetworkConnectionEx("www.hahahahahah13233423.net", 80, 3000)
Debug "purearea.net:80 won't timeout:"
Debug OpenNetworkConnectionEx("www.purearea.net", 80, 3000)

End