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