2geteilte konsole: mitloggen und gleichzeitig schreiben

Für allgemeine Fragen zur Programmierung mit PureBasic.
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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...
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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.
>_
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: 2geteilte konsole: mitloggen und gleichzeitig schreiben

Beitrag 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.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Antworten