public synchronized void ProcessJob(String inFileName){
				
		mLocalImgPath = mLocalBasePath  + "/" + inFileName;
		
		threadMessage("ServerCoordinator Process Job: " + mLocalImgPath);
		mJobsStartTime = System.currentTimeMillis();
		System.out.println("ServerCoordinator Process Job: " + mLocalImgPath);
		
		//Determine dimension of the image	
		File file = new File(mLocalImgPath); 
        FileInputStream fis;
        BufferedImage image;
		try {
			fis = new FileInputStream(file);
			image = ImageIO.read(fis);
			mImgWd = image.getWidth();
			mImgHt = image.getHeight();
		} catch (FileNotFoundException e) {			
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		}
		
		//Determine how many sub-sections of image we need to process
		//This is equal to number of job items	
		//\todo should be set at run time from image dimensions
		mHStride = 5;
		mVStride = 5;
				
		//Create job queue data structure			
		mJIList = new ArrayList<JobItem>();
		int xcoord =0, ycoord = 0;
		for(xcoord=0; xcoord<mImgWd; xcoord+=mHStride){
			for(ycoord=0; ycoord<mImgHt; ycoord+=mVStride){
				JobItem ji = new JobItem(xcoord,ycoord);
				mJIList.add(ji);
								
			}				
		}
		mNumJobItemsRem = mJIList.size();
		mCurrentJobIdx = 0;
			
		//Create worker status data structure		
		mWList = new ArrayList<String>();
		for(int n=0;n<mSC.mNumServers;n++){
			if(n != mSC.mMyID){
				mWList.add("UNINIT");
			}else{
				mWList.add("SELF");
			}
		}
			
		
		//Run Image sender thread
		mImgS.setFilePath(mLocalImgPath);
		mThImageSender.start();
						
		//Run scheduler thread
		mThScheduler.start();
	}