zyklische Threads
-
Servus!
I hab da folgende Problemstellung:
In einer Zelle sind 4 Roboter die auf einer Fertigungsstraße arbeiten.
Die Trajektorie der Roboter soll berechnet werden (tut jetzt ned zur Sache).Nu zyklisch z.b. 1000ms soll ein Aktualisierungsthread die Koridnaten in eine Datenstruktur ablegen.
Zusätzlich gibts je Roboter einen Thread die jetzt wieder zyklisch (alle verschieden) von der Datenstruktur die zurückgelegte Distanz berechnen.
Das Ende der Roboterbewegungen wird durch die 4 Roboterthreads durch die Raumkoordianten 0,0,0 erkannt.Nun zur eigentlichen Frage:
Wie genau funktioniert das mit dem zyklischen auslesen? Ich meine ich kann da ja ned Sleep(x) nehmen?
Hab was auf MSDN mit Createwaitabletimer() gefunden, allerdings bin ich mir nicht sicher ob ich da auf dem richtigen Weg bin.Kann mir da jemand eine Idee geben?
-
Wenn du eine MessageQueue hast kannst du CreateTimerQueueTimer benutzen um dich regelmäßig aufrufen zu lassen. Ansonsten spricht wenig dagegen einen Thread zu erstellen und diesen per Sleep schlafen zu legen. Es kostet ein bisschen Speicher, aber wenn du einen windowsfähigen Rechner hast, dann sollte das bei weniger als 100 so erstellten Threads nicht merkbar sein.
-
hab kein MessageQueue
dann werd ich wohl einfach sleep() nehmen.
Hab kurz vorher das hier gefunden:
http://en.cppreference.com/w/cpp/thread/sleep_for
worin liegt hier der Unterschied zum sleep()?
Darf man WINAPI-Funktionen mit den C++ Threadfuktionen vom Standard mischen?
-
Unter Windows hat AFAIK jeder Thread hat automatisch eine MessageQueue.
Nachrichten sendest du mit PostThreadMessage. Empfangen mit ganz normal mit GetMessage oder PeekMessage nur DispatchMessage solltest du dann nicht aufrufen.Darf man WINAPI-Funktionen mit den C++ Threadfuktionen vom Standard mischen?
Ja "darf" man, sollte man aber nicht (nicht aus technischen Gründen, sondern weils Unfug ist). Entscheid dich für eins von beiden. Ausnahme: Du arbeitest mit dem C++ Standard und brauchst irgendwelche Sachen die dir der C++ Standard nicht bieten kann. Dann kannst du z.B. Thread::native_handle() aufrufen.
floorball