Seite 1 von 1

2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 28.10.2010 11:19
von broozar
hallo alle zusammen,

ich versuche, die ausgabe einer (nicht-pb) app (ein dezidierter server für ein spiel, um genau zu sein) in einer konsole mitzuloggen.

zum test habe ich diese (pb-app dedi.exe) geschrieben:

Code: Alles auswählen

If OpenConsole()
  For k=0 To 4
  PrintN ("iteration "+Str(k)+" end")
  Delay(1000)
  Next
EndIf

End
ich will, dass sich meine logging-app den server jedes mal neu startet, wenn er abstürzen sollte.

kontroll- und startapp:

Code: Alles auswählen

If OpenConsole()

  hostnumber.i=1

    PrintN ("The dedicated server will try to rehost itself.")
    PrintN ("Launching server...")
    cid = RunProgram("dedi.exe", "-d dedi", GetCurrentDirectory(), #PB_Program_Open|#PB_Program_Read)
    
    Repeat
     If IsProgram(cid)
      If ProgramRunning(cid)
        While ProgramRunning(cid)
          PrintN (ReadProgramString(cid))
        Wend
      
      Else
        PrintN ("The server has stopped. Rehosting #"+Str(hostnumber)+"...")
        hostnumber+1
        cid = RunProgram("dedi.exe", "-d dedi", GetCurrentDirectory(), #PB_Program_Open|#PB_Program_Read)
      EndIf
     Else
       PrintN ("The server could not be launched.")
     EndIf
    Until Quit = 2

EndIf

End

nun ist das aber unpraktisch, dass sich der server selbst rehostet bis zum stromausfall oder systemversagen. ich muss also wieder mit dem server kommunizieren.

problem 1
dazu benötige ich eine möglichkeit in meiner kontroll- und startapp, während des mitloggens text einzugeben, wie zB "quit". der benötigte command promt input() blockt (unerwünscht), außerdem möchte ich, dass sich der command prompt immer auf der letzten zeile des konsolenfensters befindet. ich möchte eine art zweigeteilte konsole erstellen, in den oberen 80% soll der mitgeloggte text des zu überwachenden programms stehn, in den unteren 20% der "fixierte" command prompt.

problem 2
die kommunikation mit dem zu überwachenden programm gestaltet sich als schwierig. ich möchte den weg über kontrollfiles vermeiden (user gibt command in überwachungsapp ein, wird als file gespeichert, periodisches einlesen des files durch die server-app). ich habe das connect-flag in der runProgram-api gefunden, aber selbst, wenn ich es verstünde (beispiel-code scheint es dafür nicht zu geben), könnte ich einen realtime game server ja nicht anhalten und drauf warten lassen, bis der user irgenwas eingibt. hab ich einen denkfehler oder gibt es (k)einen schlaueren weg dafür?

vielen dank für eure mühe

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 28.10.2010 12:57
von broozar
werde die kommunikation wohl über sockets lösen. bleiben die probleme des input()s während des loggens und vor allem das des positionierens/ nicht mitverschieben. ich will ja nicht jedesmal die konsole clearen müssen...

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 28.10.2010 14:44
von Nino
broozar hat geschrieben:bleiben die probleme des input()s während des loggens und vor allem das des positionierens/ nicht mitverschieben. ich will ja nicht jedesmal die konsole clearen müssen...
Muss es denn unbedingt eine Konsole sein? Warum machst Du nicht einfach ein Fenster z.B. mit einem ListViewGadget zum Anzeigen des Textes und einem StringGadget für die Eingabe?

Grüße, Nino

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 28.10.2010 19:44
von broozar
hallo,

ich möchte den dedicated server irgendwo in der welt haben und fernsteuern können, dazu muss ich mich irgendwie mit der ziel maschine verbinden (ssh). das windows-eigene rdp möchte ich nicht verwenden, da das ja bei niedrigeren windows-versionen nicht als server dabei ist. außerdem möchte ich von jedem beliebigen OS über ssh den spielserver fernsteuern können. auch daher möchte ich auch auf eine grafische oberfläche verzichten.

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 28.10.2010 20:15
von ts-soft
Nur als Hinweis:

Code: Alles auswählen

    cid = RunProgram("dedi.exe", "-d dedi", GetCurrentDirectory(), #PB_Program_Open|#PB_Program_Read)
Gerade wenn Du mit Shell arbeiten möchtest, ist "GetCurrentDirectory()" verkehrt, weil es nur das Verzeichnis ist, das
mit dem Shell-Befehl gesetzt wurde und deshalb auch nicht immer gesetzt wird.

Code: Alles auswählen

GetPathPart(ProgramFilename())
gibt immer das richtige Verzeichnis zurück!
Ich weiß nicht, warum mind. jeder 2.te Programmierer diesen schwer zu findenden Fehler in sein Programm einbaut :mrgreen:

Gruß
Thomas

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 28.10.2010 20:55
von broozar
bislang nie probleme damit gehabt, aber werd's mir merken.

noch ne andere idee für die darstellung innerhalb der konsole? hier mal eine grafische veranschaulichung...

Code: Alles auswählen

--------------------- LOG ---------------------
random scrolling stuff
something the other app puts out
scroll, scroll, scroll
::app has crashed... will be restarted.
random scrolling stuff
something the other app puts out
scroll, scroll, scroll

-------------------- INPUT --------------------
this area is fixed. enter your command here.
>_

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Verfasst: 31.10.2010 18:38
von broozar
mein letzter post war näher an der lösung als ich dachte.

ich erstelle eine maske einer 80x25-konsole, wobei ich nur 79 (zeilenumbruch) und 24 (input-zeile) verwende ...

Code: Alles auswählen

Global Dim lines.s (24)
lines(0)="------------------------------------- LOG -------------------------------------"
lines(1)=""
lines(2)=""
lines(3)=""
lines(4)=""
lines(5)=""
lines(6)=""
lines(7)=""
lines(8)=""
lines(9)=""
lines(10)=""
lines(11)=""
lines(12)=""
lines(13)=""
lines(14)=""
lines(15)=""
lines(16)=""
lines(17)=""
lines(18)=""
lines(19)=""
lines(20)=""
lines(21)=""
lines(22)="------------------------------------ INPUT ------------------------------------"
lines(23)="SPACE to enter command. restart; shutdown [time]; kill"
EnableGraphicalConsole(1) muss gesetzt sein und ClearConsole() ist mein neuer bester freund.

alles, was ankommt, speichere ich in ein Global Dim input_udp.s(21) [22 leere zeilen], und update dann meine maske von oben für alles, was neu (newline.s) anfällt

Code: Alles auswählen

Procedure update_content(newline.s)
  ReDim input_udp(ArraySize(input_udp())+1)
  input_udp(ArraySize(input_udp()))=newline
  
  For k=1 To 21
  lines(22-k) = input_udp(ArraySize(input_udp())-k)
  Next
  
EndProcedure
zeichnen muss ich das alles im block,

Code: Alles auswählen

Procedure draw_console()
  ClearConsole()
  
  For k=0 To 23
  PrintN(lines(k))
  Next
  
EndProcedure
kommandos lasse ich über eine inkey/input-eingabe zu.

Code: Alles auswählen

If Inkey() = Chr(32)
command.s = Input()
vielleicht hilft das ja mal jemand.