none
Thread::Sleep() / For Loop Problem RRS feed

  • Frage

  • Hallo,

    mein Problem bezieht sich auf eine For-Schleife mit Sleep-Anweisung.

    Ungefähr so:

    for(.....){

    Mache A;

    Mache B;

    Sleep();

    Mache C;

    }

    Jedenfalls springt das Prog beim Ausführen der Schleife direkt zu Sleep und führt dann den Rest der Schleife aus.

    Ich weiß nicht, ob es was mit dem Thread zutun hat?! Denn er freezed ja quasi das komplette Programm dadurch. Verstehe nur nicht, warum er das zuerst macht und dann den Rest der Schleife. Habt ihr eventuell eine Idee?

    Danke im Voraus! 


    • Bearbeitet xyfz Sonntag, 24. Februar 2013 12:27
    Sonntag, 24. Februar 2013 12:26

Antworten

  • Ok, was da passiert ist, dass die angesprochenen Elemente entweder selber die Nachrichtenschleife nutzen (z.B. für's Behandeln des Endes vom navigate oder zum Zeichnen des Fensters... was auch immer). Und solange du nicht das was  du tust beendest und eben diese Nachrichtenschleife wieder laufen lässt, genau so lange wird gar nichts mehr gemacht und somit nichts neu gezeichnet oder sonstwie verarbeitet. Wenn du Also eine Verzögerung reinbringen willst, würde ich z.B. ein Timer aktivieren (statt des Sleep) und dann die Funktion beenden. Danach läuft die Nachrichtenschleife normal weiter und macht was sie tun soll und irgendwann wird dann ein WM_TIMER eingereiht und deine Timer-Funktion wird aufgerufen. Dort kannst du dann den zweiten Teil der Funktion ausführen. ... ich hoffe, die Idee und das Problem ist genug klar beschrieben ... auf jeden Fall liegt's daran, dass keiner mehr Nachrichten verarbeitet, solange du den Thread blockierst mit einem Sleep.

    Gruss, Rudolf

    • Als Antwort vorgeschlagen Martin RichterModerator Montag, 25. Februar 2013 07:19
    • Als Antwort markiert xyfz Montag, 25. Februar 2013 20:30
    Sonntag, 24. Februar 2013 22:30

Alle Antworten

  • Hallo

    Also, das macht er sicher nicht so wie beschrieben... ich habe ein paar Rückfragen:

    1) wer führt diese Schleife aus? ist das in einem Nachrichtenhandler drin? (also z.B. OnBnClicked oder sowas?)

    2) was ist "A, B, C" ? was tun die?

    Ich halte es dafür, dass du was falsch machst vom Threading her.

    Rudolf

    Sonntag, 24. Februar 2013 18:10
  • Ja, ist einem ButtonClick Event. 

    Es ging darum, Webbrowserinhalte zu füllen. Hat ansich auch funktioniert, nur mit Sleep eben nicht mehr. Ich dachte eben auch, dass es vom Threading her kommen müsste. Habs deshalb auch mit dem Backgroundworker probiert, aber es wurde nur bis zu einem Teil der Schleife abgearbeitet.

    Hab den Code jetzt nicht mehr zur Hand, weil ich das ganze etwas abgeändert habe, sodass es läuft.

    Sah ungefähr so aus(Pseudo):

    for(i=0;i<=var;++i){

    variablen;

    webbrowser->getbyID->ChangeValue;

    Streamwriter->txt File;

    Sleep(5000)

    webbrowser->navigate("www.xxxx.de");

    }


    • Bearbeitet xyfz Sonntag, 24. Februar 2013 20:00
    Sonntag, 24. Februar 2013 19:59
  • Ok, was da passiert ist, dass die angesprochenen Elemente entweder selber die Nachrichtenschleife nutzen (z.B. für's Behandeln des Endes vom navigate oder zum Zeichnen des Fensters... was auch immer). Und solange du nicht das was  du tust beendest und eben diese Nachrichtenschleife wieder laufen lässt, genau so lange wird gar nichts mehr gemacht und somit nichts neu gezeichnet oder sonstwie verarbeitet. Wenn du Also eine Verzögerung reinbringen willst, würde ich z.B. ein Timer aktivieren (statt des Sleep) und dann die Funktion beenden. Danach läuft die Nachrichtenschleife normal weiter und macht was sie tun soll und irgendwann wird dann ein WM_TIMER eingereiht und deine Timer-Funktion wird aufgerufen. Dort kannst du dann den zweiten Teil der Funktion ausführen. ... ich hoffe, die Idee und das Problem ist genug klar beschrieben ... auf jeden Fall liegt's daran, dass keiner mehr Nachrichten verarbeitet, solange du den Thread blockierst mit einem Sleep.

    Gruss, Rudolf

    • Als Antwort vorgeschlagen Martin RichterModerator Montag, 25. Februar 2013 07:19
    • Als Antwort markiert xyfz Montag, 25. Februar 2013 20:30
    Sonntag, 24. Februar 2013 22:30
  • Vielen Dank für deine ausführliche Antwort.

    Hast mir damit geholfen!

    Montag, 25. Februar 2013 20:31