Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ist es möglich, eine Anwendung, in der 2Threads vorkommen so zu programmieren, dass der Sheduler immer
genau nur einmal den Code inerhalb der Run Anweisung ausführt, und dann zum anderen Thread wecheslt.
Beide Threads haben eine endlos While Schleife.
Gibt es dazu ein Stichwort?
Kurzes Google ergab nicht viel weil Threads nunmal immer abwechselnd ausgeführt werden, ich bruache aber den Fall, dass eben zwei Threads im Wechsel ausgeführt werden, wobei der Code jedes Threads aber nur geneu !einmal!durchlaufen wird und dann der Wechsel stattfindet.
Klar, Threads werden schon "gleichzeitig" ausgeführt, aber nicht wirklich.
Auf einem Rechner mit ein CPU kann nur ein Prozess gleichzeitig laufen.
Das siehst du ja wenn du dir diverse Besipiele anschaust, wenn z.B. Threads einen gemeinsamen Zähler hoch oder runterzählen. Der Sheduler, also der Teil des Betriebssystems, der sich darum kümmert, nach welcher Logik einzelene Prozesse Rechenzeit bekommen, lässt die Threads auch nur Nacheinander an die CPU und nie gleichzeitig.
Aber eben weil es Threads gibt, kann ein Programm quasi mehere Sachen gleichzeitig machen, weil der Sheduler jeden Thrad quasi einzeln betrachtet, d.h. wenn du ein Progarmm hast in dem du 2 Thrads erzeugst würde volgendes passieren:
Hauptprogramm wird geladen und bekommt 10ms Rechenzeit <<hier werden z.B. Thread 1 und 2 erzeugt.
Thread1 bekommt dann auch 10ms
Thread2 bekommt 10 ms
Excel bekommt 10 ms
Word bekommt 10ms....
[....]
dann wieder Hauptprogramm
Thread1
Thread2.
Du vestehst was ich meine ; ) ?!
So und jetzt konkret zu meinem Prblem.
Ich habe einen Kicker (kürzlich schon mal anastzweise geschildert) als Java-Applet und 2 Threads.
Ein Thread ruf periodisch repaint, die Methode zur Ballberechneung (also nächste Position), und Kollisionabfrage auf.
Der andere Thread ist für die Animation für Schuss zuständig. Der andere für die Animation d. Schusses, also das Rotieren von Spieler um eine Stange.
Problem: D. Thread (unten) bekommt sagen wir 40ms Rechenzeit, in der mein Rechner es schafft das Bild um 4 Bilder (was 40° entspricht)
weiterzuschalten, dann ensteht das Prblem, dass Kollisionberechnung nicht erfolgt, sondern erst wenn der Thread die CPU wieder freigibt. Logsicher wäre es, wenn immer, nachdem ein Bild weitergeschlaten wurde, Kollision und nächste Position aufgerufen würde.
Ich könnte noch ein weiteres Problem schildern aber lasse es erstmal dabei, weils eh schon genug Text ist ; ).
Falls du dir mal ein Bild machen möchtest
public void run()
{
while (iAktBild < 35)
{
//ein Bild weiterschalten
iAktBild++;
try {Thread.sleep(iSchussRefresh);}
catch (InterruptedException e) {}
}
//Anim ist durchgelaufen, wieder 0 bild setzten
iAktBild = 0;
bSchussThread = true; // es kann wieder die Schusstaste betätigt werden
Ja, ähm ich hab im Moment im Thread requestFocus(), deswegen klaut er dir wahrschienlich immer den Fokus. Sorry; )Klar im Prinzip hast ja Recht, ABER die Animation (Rotieruen um Stange) muss mit eine Sleep von ca 15ms laufen, damit sie hablwegs ok aussieht. Die Ballberechnung sollte aber nur alle 25ms laufen, weil die Schrittweite (in Pixeln) quasi festgelegt ist (nimm einfach an bei 1Pixel und Sleep von 15 wäre er immer noch zu schnell),
und der Ball sonst einfach zu sehr abgeht.
Beni hat gesagt.:
Lustiges Feature: wenn dein Applet in meinem Mozilla läuft, funktioniert die Tastatur nicht mehr...
Aber abgesehen davon: wenn die zwei Threads sowieso immer abwechselnd am Zug sind, kannst du wirklich auch nur einen verwenden:
Ok ich denke mir ist gerade ein Besipiel eingefallen, da sieht man sehr gut wo das Problem ist!
Thread1 ruft auf: (Sleep 25ms):
1. nächste Position (setzt x, und y von Ball neu)
2. Kollision (prüft ob neue Position eine Kollsiion verursacht, wenn ja wird der Winkel des Balls entsprechen geändert)
3. reapint
4. Sleep
Thread2 ruft auf (Sleep 15ms):
1. Bild weiterschalten (aniniert also eine Spielerreihe)
Problem von Oben:
Code:
Spieler
Ball
----
||||
||||O
----
Angenommen, der Ball landet sagen wir mal ein Pixel vor den Füssen des Spielers (er guckt nach rechts; Thread1 wurde soeben durchlaufen), und Schuss wird betätigt, so kann es sein, dass Thread2 in seiner Zeit (>Sheduler) es schafft den Spieler in die 40°Position zu bringen. Währden dieser Zeit findet aber keine Kollisionabfrage statt
>> Resulatat: Der Spieler hat sich zwar über den Ball bewegt, ihn aber nicht merklich verändert.
Schlimmer noch, es kann sogar sein, dass er beim über-den-Ball-Bewegen just in dem Moment unterbrochen wird (von Thread1), indem der linke Teil seines Blockes(Fußes) über dem Ball schwebt und die Kollisionsabfrage führt die Kollsion in die falsche Richtung(nämlich nach links) aus.