Mherere Threads aufrufen ?



  • Hallo Leute,

    kann mir mal wieder jemand helfen ??

    Folgendes, ich habe eine SDI Anwendung. In dieser rufe ich ein Dialogfenster über einen Menüeintrag auf.

    Dort habe ich eine Liste von Servern mit ID´s.

    Jetzt rufe ich über einen Button ein Threads (Global) auf, das mir eine Funktion aufruft in der ich ein File für den Server durchsuche.

    Jetzt möchte ich aber nicht ein Thread aufrufen, sondern für jeden Server ein eigenes.
    Stopen und Starten soll für jeden Server eigenständig sein.

    // Global
    CCriticalSection cs;
    int m_Flag;
    
    UINT StartLogfile(LPVOID pParam)
    {
    	CLizenzenDialog* pDlg = (CLizenzenDialog*) pParam;
    	pDlg->threadStart();
    
    	return 0;	
    }
    
    // in der cpp
    void CDerDialog::OnServerStart() 
    {	
            m_iThreadServerID = m_iServerID;
    
            m_Flag = 1;
            CWinThread* pThread = AfxBeginThread(StartLogfile, this);
    }
    
    void CDerDialog::threadStart()
    {
    	CDerDialog m_CDerDialog;
    	while (m_Flag)
    	{
    		cs.Lock();
    		Sleep(1000);
                      // dies ist die Funktion die das File durchsucht
                      // 1 ist die Server ID
    		m_CDerDialog.aufrufFunktionServer(1);
    
    		cs.Unlock();
    	}
    }
    

    Kann man so was machen, und wenn ja, wo ist der Hacken ??

    Gruß
    andy_mann



  • klar kannst du mehrere threads gleichzeitig aufrufen ... 😕
    Ich glaube, ich habe dein Problem net verstanden...



  • Hallo,

    mein Problem ist, dass ich nicht weiss, wie ich den thread mehrmals Dynamisch aufrufe.

    Array oder Vector, aber wie ??

    Gruß
    andy_mann



  • ?
    AfxBeginThread einfach öfters aufrufen?



  • ich danke Dir,

    wie mache ich es aber, dass ich das Dynamisch mache ?
    Ich habe eine Liste mit Servern (eine id int).

    jetzt möchte ich einen thread auslösen vom server 1. (start)
    die anderen Server sollen aber nicht gestartet werden.

    Wird eben so, immer nur der Server der ausgewählt wurde soll gestartet oder gestopt werden, und nicht alle die in der Liste stehen...

    Gruß
    andy_mann



  • Ich löse das meistens so:

    class server
    {
    public:
    integer id;
    CDerDialog * derDialog;
    Server();
    void StartThread();
    void StopThread();
    private:
    CThread * thread;
    }
    
    server()
    {
     thread = NULL;
    }
    
    void server::StartThread()
    {
     if(thread == NULL)
     {
      thread = AfxBeginThread(StartLogfile, this);
     }
     else
     {
      thread.ResumeThread();
     }
    }
    
    void server::Stopthread()
    {
     if(thread != NULL)
     {
      thread.Suspend();
     }
    }
    

    In DerDialog habe ich dann ein CArray von Server,wo ich mir dann den Server mit der ID die ich starten will raussuchen.



  • Vielen Dank,

    muß das therad nicht Global sein ??

    Sonst wird es doch beendet, wenn der Dialog schließt ??

    Gruß
    andy_mann



  • Die Threadfunktion ist doch noch global,wo ich den Zeiger auf den Thread aufhebe hat keinen Einfluss darauf wann der Thread endet.Natürlich stürtzt der Thread ab,wenn er versuch auf einen Dialog zuzugreifen der nicht mehr dar ist,aber das war bei deinen vorherigen Entwurf genau so.



  • Bevor ich es vergesse deine Funktionen muss du so umbauen:

    UINT StartLogfile(LPVOID pParam) 
    { 
        Server * pServ = (Server*) pParam; 
        ppServ->derDialog->threadStart(ppServ->Id); 
    
        return 0;    
    } 
    
    void CDerDialog::threadStart(int id) 
    { 
        CDerDialog m_CDerDialog; 
        while (m_Flag) 
        { 
            cs.Lock(); 
            Sleep(1000); 
                      // dies ist die Funktion die das File durchsucht 
                      // 1 ist die Server ID 
            m_CDerDialog.aufrufFunktionServer(id); 
    
            cs.Unlock(); 
        } 
    }
    


  • Hallo,

    Ist Server und CThread bei Dir eine eigens erstellte Klasse ??

    Gruß
    andy_mann



  • server ist eine einfache die einen Zeiger auf deinen Dialog,die ID deines Servers und einen Zeiger auf den Thread in den diese Daten verarbeitet werden enthält.
    CThread sollte eigentlich CWinThread sein,das passiert schon mal wenn man sowas aus den Gedächnis schreibt.



  • Hallo,

    was meinst Du mit

    server ist eine einfache
    

    Klasse oder ??

    steht dieses dann in der klasse server ?

    void server::StartThread()
    {
     if(thread == NULL)
     {
      thread = AfxBeginThread(StartLogfile, this);
     }
     else
     {
      thread.ResumeThread();
     }
    }
    
    void server::Stopthread()
    {
     if(thread != NULL)
     {
      thread.Suspend();
     }
    }
    

    Gruß
    und Danke
    andy_mann



  • Ja zu beiden Fragen



  • Ich krige das Ding nicht zum laufen...

    Nur fehler..

    wo muß deiner meinung nach die Globale Funktion

    UINT StartLogfile(LPVOID pParam) 
    { 
        Server * pServ = (Server*) pParam; 
        ppServ->derDialog->threadStart(ppServ->Id); 
    
        return 0;     
    }
    

    Gruß
    andy_mann



  • Hallo,

    kann mir vieleicht jemand sagen warum ich folgenden fehler bekomme ??

    error C2065: 'IDD_LIZENZEN' : nichtdeklarierter Bezeichner

    IDD_LIZENZEN ist mein Dialog.

    Wenn ich oben aufgeführten Code raus lasse, ist alles in ordnung.

    Gruß
    andy_mann



  • Hallo,

    andy_mann schrieb:

    error C2065: 'IDD_LIZENZEN' : nichtdeklarierter Bezeichner

    du hast #include "resource.h" vergessen

    Grüße Rapha



  • Hallo Rapha,

    vielen Dank, das hat sehr geholfen..

    jetzt habe ich allerdings nochmal einen Fehler..

    error C2143: Syntaxfehler : Fehlendes ';' vor '*'
    error C2501: 'CLizenzenDialog' : Fehlende Speicherklasse oder Typbezeichner

    #include "LizenzenDialog.h" habe ich eingebracht.

    Finde den Fehler nicht...

    Gruß
    andy_mann



  • Das liegt normalerweise an der nicht includierten "LizenzenDialog.h" (was bei dir ja nicht der Fall ist).
    Dann kann es sein, dass die Klasse CLizenzenDialog nicht richtig deklariert wurde (vielleicht hast du das ; nach "class CLizenzdialog {...}" vergessen oder in der Klasse eine Klammer zuviel geschrieben)

    Poste mal etwas mehr Code/Fehlermeldungen.

    Grüße Rapha



  • Hallo Rapha,

    ich danke Dir,

    wie es aussah, hat
    #include "afxtempl.h"
    gefehlt.

    Jetzt teste ich gerade, läuft allerdings noch nicht so wie ich will.

    Gruß
    andy_mann



  • so, jetzt glaube ich dann an geister....... 😞

    nach dem ich oben den Artikel geschrieben hatte, einen Satz kopiert hatte, kam der selber fehler wieder...

    error C2143: Syntaxfehler : Fehlendes ';' vor '*'
    error C2501: 'CLizenzenDialog' : Fehlende Speicherklasse oder Typbezeichner
    error C2501: 'm_cLizenzenDialog' : Fehlende Speicherklasse oder Typbezeichner

    ich habe auch schon nach gesehen, ob ich die include anweisung ausversehen verschoben hatte, war aber noch da.

    So und nun ??
    Ich kann auch die einzelnen Dateien Kompilieren, keine Fehler.
    Beim erstellen fehler....

    Mensch, gibt es denn keine Lösung für mein Problem oder muß ich mir erst 1000000000000 Bücher durchlesen um anschließend mit 10000 Jahren einen Pobligen Code zu schreiben ??????? 😡

    Gruß
    andy_mann


Anmelden zum Antworten