tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
290
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Hallo zusammen,

    ich hab eine Frage. Hat jemand eine Idee wie man in einem Thread eine Schleife auf Grund der gleichzeitigen Abfrage nach Tastatureingabe oder Überprüfung nach Variablenänderung von ausserhalb erzeugen kann. Also ich muss quasi überprüfen, ob eine Tastatureingabe erfolgte oder der Wert einer bestimmten Variablen sich geändert hat und wenn dass der Fall ist, darf sich ein gewisser Ablauf wiederholen.

    Grüße July
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Für die Tastatur: kbhit prüft, ob eine Taste gedrückt wurde, ohne diese einzulesen.
    Variablenänderung: Alten Wert speichern und regelmäßig vergleichen. Threadsafe-Sachen nicht vergessen.

    Gruß
    july bedankt sich. 

  3. #3
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Das ist jetzt meine Lösung. Ehrlich gesagt begeister von ihr bin nicht! Falls ihr eine perfomantere habt, bitte posten!
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    void * update (void *choice)
    {
    .....
    do{
        if(kbhit())
          {
            cin >> choice;
            update(choice);
            break;
          }
        else if(anz_update==1)
          {
            update(choice);
            break;
          }
     }while(1);
    }
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Ohne zu wissen, was dein Programm eigentlich macht, was update/choice/anz_update etc. ist, kann dir da wohl keiner helfen.

    Warum rufst du update in update auf?
    Wenn anz_update 1 wird bekommst du einen Stack Overflow.

    Was ist die Variable, die sich ändert?
    anz_update?
    Wo ist dann die Absicherung für gleichzeitige Zugriffe?
     

  5. #5
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    na ja die Methode dient zur Darstellung einer Anzeige, also wenn der Benutzer iwas eintippt oder intern was neues passiert (verändert anz_update), was zu der Veränderung der aktuellen Anzeige führt, muss ich drauf reagieren.
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    anz_update wird also aus einem anderen Thread heraus verändert.
    Zitat Zitat von Sheel
    Warum rufst du update in update auf?
    Wenn anz_update 1 wird bekommst du (deswegen) einen Stack Overflow.

    Wo ist die Absicherung für gleichzeitige Zugriffe? (bei anz_update)
     

  7. #7
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Warum rufst du update in update auf?
    weil ich mit dem Thread(in diesem Fall einem bestimmten Fenster) weiter arbeiten möchte und keine Lust auf 20.000 neue Fenster hab. Und so wird die Oberfläche nur mit den aktuellen Werten aktualisiert.
    Wenn anz_update 1 wird bekommst du (deswegen) einen Stack Overflow.
    Jep, hab jetzt das auch gesehen darum hab ich gerade den Code schon angepasst.
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    void * update (void *choice)
    {
    .....
    do{
        if(kbhit())
          {
            cin >> choice;
            break;
          }
        else if(anz_update==1)
          {anz_update = 0;
            break;
          }
    Sleep(100)
     }while(1);
    update(choice);
    }

    Wo ist die Absicherung für gleichzeitige Zugriffe? (bei anz_update)
    da arbeite ich gerade dran
    Geändert von july (22.08.11 um 15:16 Uhr)
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Jetzt bekommst du erst recht einen Stack-Overflow.
    Und das Sleep zögert ihn nur hinaus.
    Der Speicher wird totzdem zugemüllt, nur langsamer.

    Reicht die while(1)-Schleife nicht, um den Thread am Leben zu halten?
    Weg mit den breaks und fertig.
     

  9. #9
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Zitat Zitat von sheel Beitrag anzeigen
    Reicht die while(1)-Schleife nicht, um den Thread am Leben zu halten?
    Weg mit den breaks und fertig.
    nein reicht nicht, weil nur die Tastatureingabe und die Variable sind die Bedingung um die Oberfläche neuaufzubauen. Und wenn ich alles in while(1) einschließe wird's nur flackern und nicht lesbar sein.
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Ich versteh dich nicht.
    Ob du jetzt eine Endlosschleife oder eine endlose Rekursion hast, was ändert das an der GUI?
    Da Draw oder was auch immer nicht in diesem Thread ist, sollte es gar nichts ändern.

    Und noch einmal: Eine Endlosrekursion ist kein Allheilmittel, sondern ein weiteres Problem.
     

  11. #11
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    es gibt keine richtige GUI, es wird nur in der Console erstmal dargestellt... Ist halt nur zum Testen eines Teils der Programm wie es aussieht, bevor es auf die HW kommt und da gibt's schon eigene Anzeige.
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Welches Betriebssystem?

    Anstatt ständig zu pollen, könntest du evtl. auch andere Methoden verwenden (WaitForSingleObject) bzw. Events oder Conditional Variables. Kommt drauf an, wer die Variable ändert (dein eigener Code?)

    Und eine Rekursion läßt sich immer in eine Iteration umwandeln.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Zitat Zitat von deepthroat Beitrag anzeigen
    Welches Betriebssystem?
    Windows XP.

    Zitat Zitat von deepthroat Beitrag anzeigen
    Kommt drauf an, wer die Variable ändert (dein eigener Code?)
    jep, der andere Thread. Conditional Variables ist auch ne gute Alternative, ich versuch mal.

    Grüße July
     

  14. #14
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von july Beitrag anzeigen
    Conditional Variables ist auch ne gute Alternative, ich versuch mal.
    Gibt es erst ab Vista.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  15. #15
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Iwie fällt mir nichts mehr ein, hab schon alles ausprobiert: die Events, Mutexe... ich krieg zwar mit, ob sich die Variable geändert hat oder ob's eine Tastatureingabe gab, aber nicht beides parallel (((( Hat jemand ne idee wie man gleichzeitig auf keyboardevent und mutex änderung z.B. abfragen kann?
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 19.09.11, 08:34
  2. Suche eine Projekt oder eine kleine Gruppe
    Von Code46 im Forum Stellengesuche (unentgeltlich)
    Antworten: 0
    Letzter Beitrag: 21.03.10, 13:49
  3. Antworten: 3
    Letzter Beitrag: 28.07.05, 13:59
  4. Antworten: 2
    Letzter Beitrag: 01.02.04, 22:11
  5. Antworten: 2
    Letzter Beitrag: 22.06.02, 00:29