Mulithreading



  • Hallo Ihr,

    mein Problem:
    Das Programm an sich funktioniert einwandfrei.
    Ich kreiere 2 Threads die parallel laufen sollen.
    Allerdings werden sie nacheindander ausgeführt. 😮

    Ich habe gelesen im Forum das man noch eine Projekteinstellung ändern muss.
    Wo finde ich diese Einstellung genau?---> habe sie leider nicht gefunden.

    Oder könnte ein nicht paralleles Ausführen noch woanders dran liegen.

    _beginthread(thread1	, 0	,	&ThreadNr );
    _beginthread(thread2	, 0	,	&ThreadNr );
    

    in Thread 1 bzw 2 werden dann Funktionen etc ausgeführt



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Dabke für die verschiebeung ins richtige Forum ^^

    PS. ich nutze VS 2010 Express falls das noch wichtig sein sollte



  • ServusundHallo schrieb:

    mein Problem:
    Das Programm an sich funktioniert einwandfrei.
    Ich kreiere 2 Threads die parallel laufen sollen.
    Allerdings werden sie nacheindander ausgeführt. 😮

    Aha und wie genau stellst du fest, dass sie "nacheinander" ausgeführt werden?



  • Ich lasse mir dazu ein * ausgeben.

    Ich habe mich über das Ergebnis gewundert .. deswegen habe ich diese * Ausgabe eingefügt und so festgestellt das er erst den Thread 2 komplett ausführt und dann den Thread 1



  • 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?


Log in to reply