Problem mit Endlosschleife !!!
-
Hallo Leute,
Ich habe folgendes Problem:
Ich möchte eine Server Tool Programmieren was Daten von einem Client annimmt !! Die Verbindung ist kein Problem !!
Mein Problem ist das ich das Tool dazu bringen muss das es immer auf eine Verbindung wartet und es soll aber gleichzeitig noch die Möglichkeit bestehen das einer auf den beenden Button drücken kann !!Den Code für das warten auf eine oder mehrere Verbindungen habe ich schon !! Problem ist das dies in einer while(1) schleife stehen muss !! Also endlosschleife !!
Das Problem ist jetzt das Wenn ich dann versuche auf Beenden zu klicken das das Tool nicht reagiert weil der Taskmanager sagt mir das es vom Tool keine Rückmeldung gibt !!Danke für die Hilfe !!
-
stichwort "thread"
while(true) ist eine endlosschleife. wenn du sie so da stehen hast, wird sie die ganze zeit durchlaufen. ausnahme irgendwann wird ein "break" innerhalb der schleife gemacht.
aber das ist nicht der sinn der sache. viele programmierer arbeiten auf diese weise. z.b. einige tipptrainer basieren auf diesem prinzip. nun, das notebook vom bekannten hatte das nicht lange mitgemacht und schon nach einer halben stunde was der akku leer. der prozessor kümmert sich schliesslich die ganze zeit um diesen code.
such lieber mehr zum thema threads. hier im forum habe ich schon manches gesehen, was recht gut aussah.
-
@alex-t
Wovon sprichst du ?
Der Prozesor ist unter Windows immer ausgelasstet.(Leerlaufprocess)@Coolsero:
Such mal hier im Forum nach AsyncSockets.
Dies Klasse ist auf nicht blockierende Sockets aufgebaut und sendet Nachrichten wenn etwas auf den Socket passiert.(Client will verbinden,sendet, etc..)
Man muss die Funktion immer von der Oberfläche trennen.
Deine Oberfläche empfängt Nachrichten von Windows (Zeichne dich neu, da ein anderes Fenster darüber war, etc.)
Dies ist die Messageloop, welche in jedem Windowsprogramm drin ist oder sein sollte.
Wenn du jetzt eine Endlosschleife machst wird die Messageloop nicht mehr ausgeführt und somit ist die Operfläche nicht ansprechbar.1. Möglichkeit ist: Dei Nachrichten in deiner Schleife abzuholen und an dein Programm übergeben.
2. AsyncSockets zu verwenden.
3. Thread und darin normale Sockets
Ich bevorzuge die 2te.
-
Unix-Tom schrieb:
Der Prozesor ist unter Windows immer ausgelasstet.(Leerlaufprocess)
jetzt stelle ich mich einfach mal doof. weil ich es nicht ganz genau erklären kann. der leerlaufprozess lastet die cpu nicht "wirlich" aus. ich habe die beobachtung gemacht, dass der prozessor kühler bleibt, wenn er nicht zu sehr von anderen prozessen wirklich ausgelastet ist. und eine endlosschleife lastet ihn nun mal aus.
fällt mir schwer jetzt alles so zu beschreiben wie ich es mir vorstelle. ich hatte an der uni mal einen kurs über bs programmierung. und im grunde ist das das gleiche als würde man oo anfangen und seine eigene gui klasse implementieren. zb. die winapi nachbauen. irgenwo befinden sich die ganzen message handler und ereignisbearbeiter und falls kein ereignis eintritt, wird die leerlauf prozedur durchlaufen und anschliessend wieder der ereignisbearbeiter.also ist der leerlauf zwar auch ein prozess, allerdings lastet er den prozessor nicht aus, wie eine endlosschleife.
wenn man ein kleines programm schreibt mit
for(;;){}
dann lässt sich der mauszeiger nicht mehr so leicht bewegen, und ausserdem wird der prozessor schon in kurzer zeit sehr viel heisser.das meinte ich. ich hoffe ich liege mit meinen gedanken nicht all zu falsch.
-
War von mir etwas falsch ausgedrückt.
Der Prozessor ist damit nicht belastet. Leerlaufprozess besagt: Das System ist zu X Prozent im Leerlauf. Ich meinte damit, da unter Windows immer irgendwas läuft. Und wenn es nur der Leerlaufprozess ist.
Eine Schleife, auch wenn sie in einem Thread ist, sollte man bei Socketprogrammierung mit MFC möglichst vermeiden, da es an der Möglichkeiten gibt.Ich denke was du meinst mit
aber das ist nicht der sinn der sache. viele programmierer arbeiten auf diese weise. z.b.
ist, daß viele Programmierer auf die GUI vergessen und einfach selbst eine Schleife machen ohne Windows auch noch Zeit zu geben etwas mit dem Programm zu tun.
-
Unix-Tom schrieb:
War von mir etwas falsch ausgedrückt.
Der Prozessor ist damit nicht belastet. Leerlaufprozess besagt: Das System ist zu X Prozent im Leerlauf. Ich meinte damit, da unter Windows immer irgendwas läuft. Und wenn es nur der Leerlaufprozess ist.
Eine Schleife, auch wenn sie in einem Thread ist, sollte man bei Socketprogrammierung mit MFC möglichst vermeiden, da es an der Möglichkeiten gibt.Ich denke was du meinst mit
aber das ist nicht der sinn der sache. viele programmierer arbeiten auf diese weise. z.b.
ist, daß viele Programmierer auf die GUI vergessen und einfach selbst eine Schleife machen ohne Windows auch noch Zeit zu geben etwas mit dem Programm zu tun.
ich glaube wir haben da auf verschiedene weise vom gleichen gesprochen! meinte das doch auch. so wie ich die theorie kenne ist es in einem oo und eo system gar nicht anders möglich. auch nichts muss etwas sein.
und zum zweiten, ja, genau das meine ich. wusste nicht, dass es solche einfallsreichen programmierer gibt, und ich will auch niemanden schlecht machen. aber tatsächlich verfahren manche nicht anders!
ich denke dabei zum beispiel an einen tipp trainer namens AlphaTast. falls du es mir nicht glaubst, such bei google danach und lade dir ein trial. ich hatte bei meinem onkel auf dem laptop dieses programm installiert. die features sind recht gut und die programmbedienung ebenfalls.
allerdings gibt es da (meiner meinung nach, wobei ich irrtümer nicht ausschliessen möchte) kein ereignis für keydown events etc. sondern eine schleife, bei der die bedingung anscheinend das ende der einzugebenen textzeile ist! und in der schleife fragt man ob ein keydown event erfolgt ist.
nur so kann ich es erklären, dass das notebook beim zweiten programmlauf schon extrem heiss wurde und die akkulaufzeit drastisch zurückging. achja, und die thermogeregelten lüfter hörten sich an, wie turbinen.
nach dem ende des programmlaufs, ging auch die cpu auslastung im taskmng von 100 % wieder runtern auf die normalen 2-10%.
-
Ich denke nicht, daß es an der Tastenabfrage liegt. Die MessageLoop ist auch "nur" eine Schleife.
Kann aber sein das er noch andere Dinge drin hat die Rechenzeit benötigen.