Thread hier sinnvoll?



  • Hallo,

    in meinem Programm brauche ich eine Funktion, die eine andere Funktion nach einer bestimmten Zeit aufruft. Nun habe ich mir überlegt, die aufrufende Funktion in einem separaten Thread laufen zu lassen. Zur Verdeutlichung:

    void funktion () {
    // tue hier irgendwas
    }
    
    void aufrufende_funktion () { // soll in einem separaten Thread laufen
    Sleep (20); // der "Timer"
    funktion ();
    }
    

    Nun meine Fragen:
    1. Ist die Verwendung eines Threads in diesem Fall sinnvoll (man muss bedenken, dass es sich hierbei um eine GUI-Anwendung handelt) und wenn ja, welche Threads soll ich verwenden (Boost, gtkmm, etc.)
    2. Ist Sleep () bzw. das Unix-Pendant sleep () hierfür geeignet?
    3. Sollte ich einen Funktionszeiger übergeben, oder die Funktion einfach so aufrufen (ich denke, dass sie Methoden der selben Klasse sein werden)

    Danke



  • für solche aufgaben bieten die meisten toolkits timer klassen an, denen ne zeit und nen funktionszeiger mitgegeben wird. funktioniert aber grundsätzlich über threads sowas. dafür sind die dinger schließlich da.



  • NEIN, für sowas verwendet man in GUI Appliaktionen doch keine Threads *wein*.

    Unter Windows verwendet man hier z.B. üblicherweise SetTimer, was zur Folge hat dass nach dem Ablauf der Zeit eine Window Message (WM_TIMER) gepostet wird, und in dem Message Handler für WM_TIMER tut man dann eben was zu tun ist.

    @basti33:
    Du solltest dir eines überlegen: du willst dass die Funktion nach 20 msec oder 20 sec oder was auch immer ausgeführt wird. Soweit so gut. Nur was soll bzw. darf der "Hauptthread" tun während die Funktion dann ausgeführt wird?
    Das "tu hier irgendwas" ist eben entscheidend, denn oft ist das "irgendwas" etwas was NICHT gleichzeitig mit beliebigem Code laufen darf den der "Hauptthread" gerade ausführen könnte.
    Und wenn das der Fall ist macht es kaum einen Sinn einen eigenen Thread zu bemühen, da man dann ganz böse anfangen müsste gewisse Zugriffe zu synchronisieren damit kein Unsinn passiert.



  • hustbaer schrieb:

    NEIN, für sowas verwendet man in GUI Appliaktionen doch keine Threads *wein*.

    Unter Windows verwendet man hier z.B. üblicherweise SetTimer, was zur Folge hat dass nach dem Ablauf der Zeit eine Window Message (WM_TIMER) gepostet wird, und in dem Message Handler für WM_TIMER tut man dann eben was zu tun ist.

    @basti33:
    Du solltest dir eines überlegen: du willst dass die Funktion nach 20 msec oder 20 sec oder was auch immer ausgeführt wird. Soweit so gut. Nur was soll bzw. darf der "Hauptthread" tun während die Funktion dann ausgeführt wird?
    Das "tu hier irgendwas" ist eben entscheidend, denn oft ist das "irgendwas" etwas was NICHT gleichzeitig mit beliebigem Code laufen darf den der "Hauptthread" gerade ausführen könnte.
    Und wenn das der Fall ist macht es kaum einen Sinn einen eigenen Thread zu bemühen, da man dann ganz böse anfangen müsste gewisse Zugriffe zu synchronisieren damit kein Unsinn passiert.

    Du kannst sagen, dass man keinen Thread nehmen soll und schreibst gleich drunter, dass man eigentlich wissen müsste, was die funktion macht, damit man sagen kann, ob man einen Thread nehmen kann.

    Wenn das was die Funktion macht "sehr lang" braucht, sollte man auf keinen Fall WM_TIMER nehmen.



  • Hallo,

    ich hatte vergessen zu erwähnen, dass ich eine platformunabhängige Lösung brauche. WM_TIMER fällt von daher schon einmal weg.
    @ thordk
    Die Funktion, die aufgerufen wird, ist im Hauptthread. Ich möchte den Timer in einem separaten Thread laufen lassen. Während der Timer läuft soll der Hauptthread nur die Möglichkeit das Programm zu beenden und den Timer zu stoppen anbieten. Wenn der Timer abgelaufen ist, kann er und der entsprechende Thread auch wieder gestoppt werden.

    Danke



  • basti33 schrieb:

    ich hatte vergessen zu erwähnen, dass ich eine platformunabhängige Lösung brauche. WM_TIMER fällt von daher schon einmal weg.

    und threads beim crossplatform-proggen erst recht! das würde nochmal verdammt schwerer werden. dann doch besser eine fertige library à la boost.thread!



  • nu macht euch ma nich ins hemd. threads sind ne ganz normale geschichte. man muss nur drauf achten, dass man nur reentrante funktionen aufruft. dann ist das ganze gedöns thread-safe und verursacht null probleme.

    dass man nen timer ohne thread lösen kann ist sicherlich richtig, aber dann muss man entweder methoden einer bestimmten plattform verwenden oder seine applikation so entwerfen, dass sie "tickt".



  • schaut euch mal boost::asio an

    das kann neben der netzwerkfunktion auch funktionen nach einer best. zeit starten



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • thordk schrieb:

    nu macht euch ma nich ins hemd. threads sind ne ganz normale geschichte. man muss nur drauf achten, dass man nur reentrante funktionen aufruft. dann ist das ganze gedöns thread-safe und verursacht null probleme.

    Ach Gott, wennst glaubst...


Anmelden zum Antworten