Toon posts:

[Borland c++] Problemen met weergave binnen console app

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik ben bezig met het schrijven van een programma in een console applicatie. Nu wordt in mijn programma gewerkt met threads die m.b.v cprintf in kleur teksten printen in de dosbox. Deze prints laten de status van het programma zien. Ondertussen kun je ook opdrachten geven aan het programma via scanf. Het probleem is echter dat wanneer je een opdracht aan het intoetsen bent en er komt weer een printf dan ben je ineens over meerdere regels aan het typen. Is er een manier waarop je dit kunt voorkomen. Bijvoorbeeld dat een stuk van het scherm alleen maar gebruikt wordt om te printen en dat je onderaan het scherm gewoon opdrachten kunt invoeren? Hoe moet je zoiets maken heeft iemand daar een voorbeeld van?

Afbeeldingslocatie: http://www.kierkels.net/console.jpg

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

eerst en vooral is wat jij hebt helemaal geen onbekend probleem.

Enkele mogelijkheden:
1) je maakt een threadsafe klasse die invoer en uitvoer behandelt.
Dit kun je ongeveer behelpen volgens het lezers-schrijvers probleem.

2) zoals jij het wil, zal je alle invoer en uitvoer zelf moeten behandelen
en ook zelf het schrijven naar de console moeten verzorgen.
imo veel te moeilijk dus voor het probleem.

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Is het niet mogelijk om gewoon twee dos vensters te openen in een programma en in de eerste te schrijven en in de tweede te printen?

Wat betreft die Threadsafe classe ik denk niet dat die mijn probleem oplost. Want dan zou er pas weer nieuwe berichten geprint worden op het scherm als ik iets heb ingevoerd. Tijdens het invoeren krijg ik dan geen informatie. Ik wil juist beide tegenlijk kunnen.

[ Voor 51% gewijzigd door Verwijderd op 05-06-2006 10:45 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
2 DOS vensters openen wordt wat lastig. DOS is namelijk al een tijdje verdwenen, en wordt nu geëmuleerd. Dat proces is NTVDM, maar ik vermoed dat je geen ODS programma's schrijft. Welke borland versie heb je?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Ik gebruik borland versie 6.

Ik vermoed dat ik twee console windows kan openen met functies in windows.h header file maar tot nu toe lukt het me niet om een tweede venster te openen.

Ik gebruik de console window puur voor debugging. Uiteindelijk wordt dit een library zonder visuele weergave.

[ Voor 26% gewijzigd door Verwijderd op 05-06-2006 13:07 ]


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

waarom dump je niet continue je uitvoer naar een file of pipe en lees je die met een ander programmaatje weer uit?
Tenminste, zo zou ik het onder *nix doen, geen idee of Windows dat uberhaupt wel kan :P

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

afaik kan een proces slechts met 1 console zijn geassocieerd.

als het puur voor debugging is zou'k de moeite niet doen.
De oplossing wordt zowiezo veel te moeilijk voor wat het maar is.

je kan eventueel proberen om met pipes of een TCP/IP verbinding de functionaliteit te bereiken.

ik denk er net aan:
Als je teken per teken zelf inleest, moet je mits wat creatief werk alles gedaan krijgen. Maar da complexiteit zal zeker boven het niveau van "snel wat debugging dingen" zitten.

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Ik probeer eigenlijk gewoon het bovenstaande probleem op te lossen. Ik dacht dat dit makkelijk ging met twee console windows. Maar als dat niet kan dan misschien maar via een tweede programma dat een bestand inleest.

Verwijderd

Vroeger leverde Borland bij z'n compilers wel TurboVision mee, een library waarmee je meerdere 'windows' in je console scherm kon definieren en aanspreken.

Maar sinds het ontstaan van Windows en andere GUI's is 't bestaansrecht nogal nutteloos geworden.
Waarom maak je er niet een windows app van die z'n output in 1 control zet (memo, listbox), en input accepteert vanuit een ander control?

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

threadsafe maken is vrij makkelijk te doen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CRITICAL_SECTION section;

int main()
{
    InitializeCriticalSection(&section);
    // jouw code
    DeleteCriticalSection(&section);
}

void Log(char *text)
{
    EnterCriticalSection(&section);
    // schrijf naar je console
    LeaveCriticalSection(&section);
}

-niks-


Verwijderd

Topicstarter
Dat threadsafe maken lost dat ook het probleem op van dat ik tegenlijk wil kunnen invoeren en prints kunnen ontvangen. Dus ondertussen dat ik een commando intype dat er nog steeds berichtjes verschijnen zonder dat mijn commando dan over meerdere regels komt te staan?

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
MLM schreef op maandag 05 juni 2006 @ 16:26:
threadsafe maken is vrij makkelijk te doen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CRITICAL_SECTION section;

int main()
{
    InitializeCriticalSection(&section);
    // jouw code
    DeleteCriticalSection(&section);
}

void Log(char *text)
{
    EnterCriticalSection(&section);
    // schrijf naar je console
    LeaveCriticalSection(&section);
}
Die critical section moet je niet zomaar aanzetten, anders staat alles op elkaar te wachten.

Een oplossing zou kunnen zijn om juist de critical section aan te zetten zodra je een karakter als input krijgt (misschien een bepaald karakter), tot een enter oid, waarna de critical section weer uit kan.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Wat je eigenlijk wilt is een soort van split-screen creeren waarin je een eigen regel voor de input reserveert. Het probleem is dat normale console I/O stream-gebaseerd is dus geen benul heeft van cursorposities, kleuren e.d. Om dit toch te bereiken zul je je moeten bedienen van platform-specifieke functionalitieit.

Windows heeft standaard een aantal console functies waarvan hier een overzicht:
http://msdn.microsoft.com...ase/console_functions.asp
Zie SetConsoleTextAttribute, SetConsoleCursorPosition en SetConsoleCursorInfo.

Voor Linux heb je escape codes en libraries zoals ncurses om mee te werken. Helaas ken ik geen libraries die een mooie cross-platform oplossing bieden.

Verwijderd

Topicstarter
Okeej bedankt..

Heb toch maar besloten het via een aparte InputBox() te doen en de berichten in de console window te printen. Nu heb ik alleen het idee dat na een tijdje cprintf niet goed meer werkt en letters achterlaat op het scherm helemaal onderaan. Kent iemand dit probleem en de oplossing?
Pagina: 1