Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » handlungskette durch bool abbrechen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.12.2004, 11:29 Uhr
~Blood hawk
Gast


mal wieder ne frage über mein game(win32 dll)
bedingung zum true machen:

C++:
if ((aPacket[0]==0x77)&&(aPacket[1]==0x0e))
{set=false;set=true;}


während true:

C++:
DWORD EXPORT OnGameTimerTick()
{ Timer++;
if((Timer%10)&&(set))
{Sleep(1000);server->GamePrintInfo("1");
Sleep(1000);server->GamePrintInfo("2");
Sleep(1000);server->GamePrintInfo("3");
Sleep(1000);server->GamePrintInfo("4");
Sleep(1000);server->GamePrintInfo("5");set=false;}
return TRUE; }



das programm soll, wenn set=true ist 5 sek warten und fertig
ich will aber, dass sobald während den 5sekunden set false gemacht wird und wieder auf true gesetzt wird, dass es wieder von vorne anfängt!
wie der titel schon sagt, einfach die handlungskette unterbrechen sobald set=false ist!

ich hoffe ihr bekommt das hin!
gruß, nighthawk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.12.2004, 11:53 Uhr
Oliver
S2-Pixelgeneral


Wo setzt es wieder false? Arbeitest du mit Threads?

Was soll das eigentlich bringen ??


C++:
if ((aPacket[0]==0x77)&&(aPacket[1]==0x0e))
{set=false;set=true;}


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.12.2004, 11:57 Uhr
~Hawk
Gast


jo das sind threeads!
in dem game bekommt man verschiedene packets..
und sobald das packet 770e kommt
wird set auf false gesetzt um so die handlungskette abzubrechen und danach wieder auf true, um sie neu zu starten! aba das geht irgendwie nit
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.12.2004, 12:36 Uhr
Oliver
S2-Pixelgeneral


Überall wo man Threads vermeiden kann, sollte man es tun. Hier ist es eigentlich kein Wunder. In den paar Nanosekunden, in denen die Variable wieder auf true gesetzt wird, glaube ich nicht, dass der andere Thread das zugleich abfragt. Threads machen ein Programm nur langsamer und vor allen Dingen fehleranfälliger!
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.12.2004, 13:29 Uhr
~hawk
Gast


das problem ist, dass ich threads brauche!
zb wenn ein packet received ist
wenn ich eins absenden will
für einen command
für screendrawing.. etc!
das kannst nicht in ein main packen

aber selbst wenn ich die handlungskette bei "timetick" laufen lass
und während dessen mit einem command set=false mache, dann lauft die handlungskette trotzdem zuende!
aba mit den nano sekunden hast recht.. timer lauft hier jede 10tel sekunde! aba mit einem sleep zwischendrin ist es auch nicht getan! ich brauch irgendwas um die handlungskette zu brechen!
vll mit while und break? obwohl dies glaub ich schief geht und das ganze game hängt sich auf!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.12.2004, 14:09 Uhr
Oliver
S2-Pixelgeneral



Zitat:

das problem ist, dass ich threads brauche!
zb wenn ein packet received ist
wenn ich eins absenden will
für einen command
für screendrawing.. etc!
das kannst nicht in ein main packen



Doch, das geht schon. Wenn das Programm im Leerlauf ist, kannst du alles abfragen in einer Schleife schön der Reihe nach. Aber die Threads machen dann, was sie wollen. Dann ensteht so ein "vielleichtgehtsvielleichtauchnicht"-Programm. Da ist es dann schwierig die Fehler zu finden. Denn wenn du nur eine Gameloop hättest, müsstest du dich nicht mit solchen Problemen herumschlagen. Dann ginge das viel einfacher.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 27.12.2004 um 14:09 Uhr von Oliver editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.12.2004, 14:35 Uhr
Hans
Library Walker
(Operator)


Hi,

ich glaube, die Lösung Deines Problems sind Semaphoren. Die dienen dazu, einzelne Prozesse, oder auch Threads miteinander zu synchronisieren, so das ein bestimmter Thread an einer bestimmten Stelle im Programm erst mal in Warteposition geht, bis eine bestimmtes Ereigniss eintritt. Das wird ihn dann über den Wert der Semaphore mitgeteilt. Wie man das genau macht, hängt immer vom jeweiligen System ab, aber ich denke, da wird es ein paar Beispiele in der MSDN geben.
Ansonsten findest Du ein paar grundsätzliche Erklärungen zu Semaphoren in allgemeinen Büchern über Betriebssysteme, zum Beispiel diesem hier


von A.S. Tanenbaum.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.12.2004, 15:31 Uhr
~nighthawk
Gast


hussa!! nett das du mir hilfst, aber ich bin noch ein anfänger!
ich versuchs mit while und break! wenns nicht klappt stopp ichs eben manual!
trotzdem danke an euch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.12.2004, 21:29 Uhr
Hans
Library Walker
(Operator)


Hi,

da Du da oben geschrieben hast, das Du mit Threads arbeitest, bin ich davon ausgegangen, das Du kein wirklicher Anfänger mehr bist. Was das Buch angeht, das ist auch "nur" ein einführendes Lehrbuch. Ansonsten hier mal kurz das wesentliche: Semaphoren sind eine spezielle Sorte Variablen, die vom Betriebssystem verwaltet werden. Das stellt dabei sicher, das Änderungen daran zu einem Zeitpunkt nur von einem einzigen Programm oder Thread vorgenommen werden können. Andere Programme oder Threads müssen solange warten, bis die Semaphore vom System wieder frei gegeben wird, um ihren Zustand abfragen zu können.
Wenn man jetzt zwei Threads miteinander synchronisieren möchte, was nichts anderes bedeutet, als ihre Arbeit so zu koordinieren, das mit einer bestimmten Aktion erst dann angefangen wird, wenn andere Aktionen vollständig fertig sind, kann man Semaphoren benutzen. Die Semaphore zeigt dem einen Thread an, das andere noch nicht fertig sind, und dem entsprechend noch warten muss. Wenn die anderen fertig sind, ändern sie den Wert (oder Zustand) der Semaphore. Wenn die Semaphore dann beispielsweise den Wert 0 (Null) erreicht hat, weis der wartende Thread, das alle anderen fertig sind, und er mit seiner weiteren Arbeit fortfahren kann.
In Deinem speziellen Fall wäre es die Variable set, die Du als Semaphore einsetzen musst, damit Deine Handlungskette unterbrochen wird, also ein Teil des Programms in Warteposition geht.
Wie man Multithreadingprogramme schreibt, steht u.a. in der MSDN, hier sogar auf Deutsch.
Ansonsten hilft vielleicht noch ein Blick auf die Ergebnisse von Suchmaschienen. Wenn dort von Semaphoren im Zusammenhang von Prozess- oder Threadsynchronisation oder dem sogenannten "5-Philosophen-Problem" die Rede ist, bist an der richtigen Stelle.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 27.12.2004 um 21:42 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.12.2004, 21:55 Uhr
~nighthawk
Gast


aha o.O
ich hab jetzt mal mit dem buch c++ anfangen anwenden verstehen von andré willms angefangen! das les ich erst mal zu ende über die ferien!
die threads sind für mich kinderleicht zu programmieren, da ich nur sehr wenig definieren muss, weil der rest alles in header files steckt, die fürs programmieren bei allen modulen für das game nötig sind!
allein die thread definierung vom packet to server hat schon nen kilometerlangen sourcecode!! da haste recht dass das nur was für fortgeschrittene ist!
trotzdem ma bis hierhin vielen dank, wenn ich mein buch durchhab guck ich mir die sache mal näher an
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: