Listing 8: A multithreaded use of DirWalk
#include <windows.h> #include <process.h> #include <iostream> #include "DirWalk.h" #if !defined(__BORLANDC__) unsigned int WINAPI WalkingThread(LPVOID lpvStartingDir); #else void WalkingThread(LPVOID lpvStartingDir); #endif CRITICAL_SECTION CriticalSection; class TheWalk : public DirWalk { static int id_; int thisid_; public: inline TheWalk(const char* StartingDirectory) : DirWalk(StartingDirectory) { thisid_=id_++; } protected: inline virtual void FoundFile() { EnterCriticalSection(&CriticalSection); cout << endl << "Thread #" << thisid_ << endl; DirWalk::FoundFile(); cout << endl << FullPathName(); LeaveCriticalSection(&CriticalSection); } }; int TheWalk::id_ = 0; int main(int argc,char* argv[]) { if(argc!=5) return 1; InitializeCriticalSection(&CriticalSection); HANDLE ThreadHandles[4]; for(int i=0;i<4;i++) { #if defined(_MSC_VER) unsigned int ThreadID; ThreadHandles[i]=(HANDLE)_beginthreadex( NULL,0,WalkingThread,argv[i+1],0,&ThreadID); #elif defined(__BORLANDC__) unsigned long ThreadID; ThreadHandles[i]=(HANDLE)_beginthreadNT( WalkingThread,0,argv[i+1],NULL,0,&ThreadID); #else unsigned long ThreadID; ThreadHandles[i]=CreateThread( NULL,0,WalkingThread,argv[i+1],0,&ThreadID); #endif } WaitForMultipleObjects(4,ThreadHandles,TRUE,INFINITE); for(int j=0;j<4;j++) { CloseHandle(ThreadHandles[j]); } DeleteCriticalSection(&CriticalSection); return 0; } #if !defined(__BORLANDC__) unsigned int WINAPI WalkingThread(LPVOID lpvStartingDir) { #else void WalkingThread(LPVOID lpvStartingDir) { #endif TheWalk w((const char*)lpvStartingDir); w.Walk(); #if !defined(__BORLANDC__) return 0; #endif } //End of File