Funktionen im Hintergrund laufen lassen ?



  • Hallo Leute,

    Ich möchte einen Live Ticker bei meinem Programm laufen lassen.
    Beim Drücken eines Buttons in einem Dialog, soll ein Timer gestartet werden, der alle Secunde was macht.

    Wenn ich nun aber in der Class des Dialoges dies mache, bleibt mein Programm mit dem Dialog ja stehen.

    Ich möchte aber, dass er dies im Hintergrund des Programmes laufen lässt.

    Wo muß ich jetzt die Funktion aufrufen und in welcher class ??
    In der CProjektView ??

    Gruß
    und Danke
    andy_mann



  • Hi!
    Nun dazu brauchst du Threads.

    thread = CreateThread(NULL, 0, startThread, this, 0, &threadID);
    

    Gibt einen Handle zurück. "startThread" ist die Funktion in dem der neue Thread starten soll. Z.B:

    DWORD WINAPI startThread(LPVOID pParam)
    
    WaitForSingleObject(thread,INFINITE);
    

    Lässt den Hauptthread warten, bis der Thread mit dem Handle "thread" mit return 0 beendet worden ist.

    Achtung schreiben 2 Threads gleichzeitig an die gleiche Adresse, dann kann es zu unerwünschten Nebenwirkungen kommen. Deshalb müssen 2 Threads in einem solchen Fall synchronisiert werden z.B. mit CCriticalSection.

    Falls noch was unklar ist, dann schreib. Muss jetzt aber auf den Zug 😉

    Grz daboss



  • Hallo,

    vielen Dank für die schnelle Antwort.

    ABer wo muß ich diese Funktion aufrufen und wo Deklarieren ??

    Gruß und Danke
    andy_mann



  • Die funktion startThread muss eine globale Funktion sein, die du dann an den Thread übergibst. In deinem Fall wird es wohl eine Endlosschleife sein. Dann musst du den Thread von außen beenden.
    Du kannst den Thread übrigens auch mit AfxBeginThread() starten.



  • Hallo Leute,

    sorry, ich komme da immer noch nicht klar.

    In welcher Classe soll ich denn diese Globale Funktion aufrufen ?
    Und wo rufe ich den meine eigene Funktion im Thread auf, die mein z.b. Mein File durchsucht ??

    Könnte mir jemand ein etwas genaueres Beispiel Source zeigen ??

    Vielen Dank
    Gruß
    andy_mann



  • da der thread vermutlich zu deinem dialog gehören soll in der art

    im header deiner dialogklasse fügst du bei den members folgendes hinzu

    int flag;
    static DWORD MyThreadRoutine(LPVOID);
    HANDLE h_MyThreadRoutine;
    

    z.b. in OnInitDialog schmeisst du dann den Thread an

    flag=0;
    h_MyThreadRoutine=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadRoutine, (LPVOID)this, 0, NULL);
    

    dann schreibst du noch deine threadroutine

    DWORD MyDlg::MyThreadRoutine(LPVOID lparam){
    
    MyDlg*dp = ((MyDlg*)lparam); //damit du zugriff auf die members deines dialoges hast
    while(!dp->flag){ //wenn du das flag dann irgendwann auf nicht 0 setzt (z.b. weil der user was geklickt hat, springt der thread aus der schleife und wird beendet...
    //... hier ballerst du das rein was der thread machen soll
    }
    }
    


  • Hallo Windalf,

    vielen Dank für dein Posting, deine anweisung funktioniert.

    Allerdings noch nicht ganz so wie ich mir das vor gestellt habe.

    Ich habe eine SDI Projekt erstelt. In diesem gibt ein Menüpunkt in dem ich ein Dialog aufrufe.
    In diesem Dialog habe ich zur ansicht eine ID Nr eines Servers und einen File Pfad dazu.

    Jetzt möchte ich gerne, dass ich auf einen Butten drücke, und er soll mir eine Funktion starten, die z.b. das File nach kriterien andauernd durchsucht.

    Beim schließen des Dialoges soll das Durchsuchen nicht beendet werden.
    Erst nach dem ich wieder das Dialog aufrufe und einen weiteren Butten klicke der dann stop regelt.

    Des weiteren sollen mehrere Fils Durchsucht werden, sprich es gibt mehrere Server ID und Pfadangaben, die ich mit der selben Funktion durchsuchen lasse.

    Gibt es dazu eine lösung mit deiner Beschreibung ??

    Gruß und vielen Dank
    andy_mann



  • also wenn du den dialog erstellst und wieder killst musst du ja sicherstellen das der so lange existiert bis der mit seiner arbeit fertig ist...

    also ne fertige lösung kann ich dir nicht bieten aber es gibt da bestimmt mehrere Lösungsansätze was man da machen kann...

    man könnte z.b. den dialog nur einmal erstellen... wenn man ihn gerade nich haben will dann wird der auf unsichtbar gesetzt und an sonsten halt wieder auf sichtbar...
    dann würde auch der thread im hintergrund weiterlaufen auch wenn du schon wieder dabei bist irgendwas anderes zu machen...

    wenn der noch weiterarbeiten soll obwohl dein dialog schon geschlossen ist, kannst du daraus kein member deines dialoges machen... es sei denn du wartest mit dem schliessen bis der fertig ist...



  • mmmhhh.....

    kann man nicht die threads z.b. in der CProjectDoc anlegen, in meinem Dialog holle ich mir die classe CProjectDoc her, setzte z.b. die flag auf 0, gebe noch meine ID des Servers mit und das Ding rennt dann ??

    Mal so als Theori gedacht ??

    Gruß
    andy_mann



  • Hallo, noch mal ich.

    ich rufe ja jetzt mit:

    h_MyThreadRoutine=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadRoutine, (LPVOID)this, 1, NULL);
    

    den thread auf.

    Im Thread rufe ich ein funktion auf, die einen int parameter benötigt.

    Wie kann ich dem oberen aufruf jetzt diesen parameter mitgeben ??

    Gruß und danke
    andy_mann



  • Hi,

    entweder du verwendest eine globale Variable oder du machst eine eigene Struktur/Klasse, die du als Parameter übergibst.

    Grüße Rapha


Anmelden zum Antworten