Mulithreading



  • nochmal zur Erklärung
    Thread 1 soll 1mal ausgeführt werden (dauert relativ lange)
    Thread 2 führt eine Funktion aus die mittels Schleife 7 mal ausgeführt werden soll während Thread 1 läuft.

    Also
    | ..............................Thread 1...............................|
    |Funktion..Funktion..Funktion..Funktion..Funktion..Funktion..Funktion..|



  • Bei mir geht's, muss wohl an deinem Code liegen.



  • Was genau tun die Threads? Irgendetwas, was wenigstens mal ein paar Millisekunden/Sekunden dauert oder nur 3 mal addieren und tschüss?



  • Thread 1: dauert länger (führt eine Bewegung über Motoren etc aus)
    Thread 2: soll Messungen machen



  • Ich würde dann eher wagen zu behaupten, dass das Problem in den Run-Funktionen selbst liegt... Denn derartiges Verhalten ist mir noch nie aufgefallen.



  • mmmmmm müsste also ein Timing Problem sein?
    Ich habe in den Funktionen selbst kein Timing oder ähnliches drinne auch kein Sleep() oder sowas.

    Ich starte sogar zuerst das Messen und dann das Fahren. Allerdings wird erst das Fahren und dann das Messen ausgeführt.



  • Hast du irgendwelche Arten von Synchronisation ( Mutexes, CritSects, etc.. ) eingebaut, die das vielleicht verursachen könnten?



  • Hallo,

    danke schonmal für die schnelle Antwort jedesmal.
    Also ich erzeuge zwar Mutex nutze sie aber nicht
    am anfang steht also

    hScreenMutex	= CreateMutex( NULL, FALSE, NULL );
    hRunMutex       = CreateMutex( NULL, TRUE , NULL );   
    ThreadNr = 0;
    

    und am Ende

    hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
    GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );
    ClearScreen();
    WriteTitle( 0 );
    
    ShutDown();
    CloseHandle( hScreenMutex );
    CloseHandle( hRunMutex );
    CloseHandle( hConsoleOut );
    


  • Kommunizieren die Threads auf irgendeine Art und Weise mit einander?



  • Habe auf deine Idee hin einfach mal alles was ich oben gepostet habe auskommentiert. Jetzt werden wirklich nur die threads gestartet mehr nicht und trotzdem habe ich denselben Fehler in den Messergebnissen.



  • Hallo,

    die beiden Threads kommunizieren nicht. Es sollen nur beide starten und parallel laufen.



  • Zäume doch das Pferd mal nicht von hinten auf.

    Schmeiß mal die ganze Funktionalität aus den Run-Funktionen raus und mach (Endlos)Schleifen mit Sleep und Textausgabe rein und prüfe dann das Ergebnis.

    Wenn die dann immmer noch nicht gleichzeitig ticken, dann fällt mir langsam auch nichts mehr ein 😉



  • benutzt dein "motor - thread" evtl irgendwelche funktionen die den thread an sich blockieren lassen (sprich positionierung oder sowas)?



  • hallo,

    also die Idee mit dem auskommentieren hat funktioniert.
    Es liegt irgendwie an dem Messthread.

    Der Fahrenthread läuft einwandfrei und blockiert eigentlich auch nix. Es waren vorher 2 einzelne Programme die nun kombiniert werden.

    Eine Frage laufen Threads parallel oder nur quasiparallel?

    Würde erklären warum immer nur eins von beidem ausgeführt wird.

    Mein Test war :
    beginthread(messen)
    beginthread(fahren)

    in der funktion messen habe ich dann erstmal die Funktionen zum Messen auskommentiert und habe nur ein* ausgeben lassen.
    Ergebnis:
    Motor fährt und parallel werden * ausgegeben.

    Also muss es ja an der Messfunktion liegen.

    Kann es evtl an einem Trigger liegen? Das die Messevents auslöst ?


  • Mod

    Threads laufen parallel wenn Du einen Prozessor mit mehreren Kernen hast.
    Die Ausgabe führt letzten Endesnatürlich auch zu einer Synchronisation weil diese auch immer nur für einen Thread zu einer zeit möglich ist.

    Was hast Du denn für Synchronisationsmethoden verwendet? Critical Sections Mutex???
    Wodurch willst Du wissen, dass ein Thread nicht läuft?



  • Hallo,

    ich sehe das der 2te Thread nicht läuft, da die Messergebnisse dies deutlich machen. sonst wäre mir das gar nicht aufgefallen.

    Ich habe gar keine Synchromethodenverwendet. 😮 😕
    Die Ausgabe war auch nur ein Test damit ich etwas auf der Konsole sehe.

    Zur Zeit ist es so:
    Motor fährt danach werden die Messungen gemacht, obwohl ich zu erst den Messthread starte und danach den Motorthread.

    Ziel:
    Starten von Motorthread
    Starten von Messthread
    = Messungen während der Bewegung sind möglich


  • Mod

    1. Wie willst Du bitte ohne Threadsynchronisation etwas messen, was sich verändert?
    2. Wenn Du keine Synchronisation verwendest dann laufen die Threads auch.



  • Die Threads laufen ja auch, allerdings leider nacheinander.

    Die Messungen funktionieren auch allerdings werden die Bilder nach Beendigung der Bewegung gemacht.

    Ich rufe die Threads jeweils mit

    _beginthread(messen	, 0	,	NULL );
    _beginthread(fahren	, 0	,	NULL );
    

    auf.

    Oder muss ich den Thread verschiedene Prios verteilen?
    Oder was mit Mutex anstellen?

    Gibts nicht einfach so was wie
    Starte Threads so das diese einfach nur anfangen zu laufen.
    Ich benötige erstmal keine Synchro dazwischen, es greift auch keine auf die andere zu. Sie sollen einfach nur beide anfangen zu laufen und das wenns geht einigermaßen gleichmäßig.
    Jetzt starten sie nacheinander bzw die 2te läuft erst dann weiter wenn die 1te zu Ende ist.


  • Mod

    Dann besorge Dir einen langsameren Rechner.
    Oder verwende Tasks die länger dauern... 😉




Anmelden zum Antworten