Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Thread Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.05.2004, 21:28 Uhr
AlfameisterT



Hallo,

habe da ein Thread Problem und steht jetzt irgendwie auf dem Schlauch

Ich habe eine Klasse, eine bestimmte Methode soll was in einem neuen Thread machen.

Meine Methode ruft die eine Funktion wiefolgt auf:

Code:
int CBrowseFolder::FindFiles(CString path)
{
      m_strPath=path;
      CWinThread *threat = AfxBeginThread(threadFindFiles,this);
...



So schaut meine Funktion aus

Code:
UINT threadFindFiles(LPVOID pParam)
{
    CBrowseFolder *ptr = (CBrowseFolder*) pParam;
    CString temp;    
    CFileFind finder;
    int anzahl=0;
    
    BOOL bWorking = finder.FindFile(ptr->m_strPath+"\\*.*");
        
    while (bWorking)
    {
            bWorking = finder.FindNextFile();            
            
            temp=finder.GetFileName();
            
            if (finder.IsDots())
            continue;    
                        
            if(finder.IsDirectory()!=0)
            {
                temp=finder.GetFilePath();
                ptr->findFiles(temp);
            }
            else
            {                    
                if( (temp.Find(".htm") != -1) )
                {
                    ptr->m_Files->Add(CString(finder.GetFilePath()));
                    anzahl++;
                }
            }
    }    
    
    ptr->m_iAnzahl=anzahl;
    ptr->m_iThreadStatus=true;
    return 1;
}


So jetzt muss diese Funktion evtl. sich selbst aufrufen.
Aber dann wird ja immer wieder ein neuer Thread gestartet

Wie lößt man sowas am besten?

Dieser Post wurde am 17.05.2004 um 21:29 Uhr von AlfameisterT editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.05.2004, 21:58 Uhr
~daDings
Gast


Treads sind nicht mein Ding... aber ich denk das ganz liese sich leicht in einer Klasse abhandeln und dort dann suchen. Da kannst dann rekursive- dingensen machen soviel du willst
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.05.2004, 22:44 Uhr
AlfameisterT



so hatte ich es vorher, aufgerufen wird das ganze aus einen Dialogfenster, dieses hängt dann aber bis alles fertig ist.
Darum wollte ich ein kleines Fenster mit Fortschrittbalken und das man den Thread bei Bedarf abschiessen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.05.2004, 22:51 Uhr
~daDings
Gast


wie gesagt ich bin da keine grosse Hilfe, aber ich hab gemeint das du aus der Thredfunktion eine Klasse aufrufst.....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.05.2004, 09:06 Uhr
ao

(Operator)



Zitat:
AlfameisterT postete
Aber dann wird ja immer wieder ein neuer Thread gestartet

Und du überschreibst dir jedesmal die m_strPath-Variable, d.h. du findest wohl den Rückweg nicht mehr.

Der Fehler ist, du hast die Funktionen so verschachtelt, dass jeder rekursive Aufruf erst mal bei AfxBeginThread vorbeiführt. Das darf nur einmal am Anfang geschehen.

Du brauchst im Prinzip drei Funktionen:

1. einen Thread-Erzeuger, der z.B. AfxBeginThread aufruft (genau einmal).
2. eine Threadfunktion (threadFindFile)
3. eine weitere Funktion, die rekursiv in den Verzeichnisbaum eintaucht. Diese wird einmal von der Threadfunktion aufgerufen und ruft sich dann selber auf. Das könnte auch die Threadfunktion selber sein, aber wozu? Eine Funktion mehr kostet dich nichts und verbessert die Übersichtlichkeit.


Bearbeitung von ao:
Nein, vergiss das. Du musst den Thread ja wieder terminieren, und das geht am Ende der Threadfunktion. Dazu darf die Threadfunktion nicht rekursiv sein. Also auf jeden Fall drei Funktionen schreiben!

Den Pfadnamen solltest du nicht in einem Klassenmember halten, sondern in lokalen Variablen innerhalb der Funktionen, dann wird er auch nicht überschrieben.

Dieser Post wurde am 18.05.2004 um 09:09 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.05.2004, 18:26 Uhr
AlfameisterT



ok, ihr habt recht...
ich habe das jetzt ganz anders gemacht,
eine Threadfunktion die eine Instanz von CBrowseFolder erzeugt, und dann auch suchen lässt, und noch paar andere Dinge.
Das klappt jetzt auch alles

Jetzt ein erneutes Problem.
Ich möchte wenn der Thread arbeitet, ein kleines Fenster über meiner Dialoganwendung anzeigen. Dieses beinhaltet .gif Sanduhr und ein "Vorgang abbrechen" Button.
Dieses soll beim Start angezeigt werden, und wenn der Thread fertig ist wieder geschlossen werden oder eben wenn "abrechen" gedrückt wird.

Ich habe es mit einem Dialogfenster versucht, aber das heut ja überhaupt nicht hin. (würde funktionieren wenn ein Startbutton da wäre).

Wie geht man da am besten vor?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.05.2004, 18:51 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wo genau ist das Problem?

Du kannst mit WaitForSingleObject auf das Ende des Threads warten und ihn mit TerminateThread killen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.05.2004, 20:13 Uhr
AlfameisterT



hmm, ich versuche mal zu beschreiben wie ich es versucht habe,

In einer Dialoganwendung instanziere ich ein neues Dialogfenster, übergebe ein paar Variablen, und lass das Fenster mit .DoModal() erscheinen.
In der Methode OnInitDialog vom neuen Fenster starte ich eine Funktion in einem neuen Thread. Ich warte eine gewisse Zeit, und meistens ist der Thread dann auch fertig oder ich schreite ein.
Wie schließe ich jetzt das Fenster wieder?
Die Methode "OnInitDialog()" muss ja noch irgendwann einen "return true" oder so zurückgeben.
Also kann ich da garnicht einfach CDialog::OnOK() aufrufen um das Fenster zu schließen.

Dieser Post wurde am 18.05.2004 um 20:13 Uhr von AlfameisterT editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.05.2004, 17:29 Uhr
AlfameisterT



ok Jungs ich habe es nun doch hingebracht.
Mit einer ausnahme, der Thread wird nicht von ausen überwacht.

Ich starte den Thread in der "OnInitDialog"
übergebe den this Zeiger,
und wenn der Thread fertig ist, ruft er über den Zeiger die "EndDialog" Methode auf.
Durch das Dialogfenster kann der User den Fortschritt sehen und den Thread auch manuel beenden.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: