+#else
+ //////////////////////////////////////////////////////////////////////////////////////////////////////
+ //Windows version shared memory, so be careful when passing variables through the alignData struct.
+ //Above fork() will clone, so memory is separate, but that's not the case with windows,
+ //////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ vector<alignData*> pDataArray;
+ DWORD dwThreadIdArray[processors-1];
+ HANDLE hThreadArray[processors-1];
+
+ //Create processor worker threads.
+ for( int i=0; i<processors-1; i++ ){
+ //copy templateDb
+ //AlignmentDB* tempDB = new AlignmentDB(*templateDB);
+
+ // Allocate memory for thread data.
+ string extension = "";
+ if (i != 0) { extension = toString(i) + ".temp"; }
+
+ alignData* tempalign = new alignData(templateFileName, (alignFileName + extension), (reportFileName + extension), (accnosFName + extension), filename, align, search, kmerSize, m, lines[i]->start, lines[i]->end, flip, match, misMatch, gapOpen, gapExtend, threshold, i);
+ pDataArray.push_back(tempalign);
+ processIDS.push_back(i);
+
+ //MySeqSumThreadFunction is in header. It must be global or static to work with the threads.
+ //default security attributes, thread function name, argument to thread function, use default creation flags, returns the thread identifier
+ hThreadArray[i] = CreateThread(NULL, 0, MyAlignThreadFunction, pDataArray[i], 0, &dwThreadIdArray[i]);
+ }
+
+ //need to check for line ending error
+ ifstream inFASTA;
+ m->openInputFile(filename, inFASTA);
+ inFASTA.seekg(lines[processors-1]->start-1);
+ char c = inFASTA.peek();
+
+ if (c != '>') { //we need to move back
+ lines[processors-1]->start--;
+ }
+
+ //using the main process as a worker saves time and memory
+ //do my part - do last piece because windows is looking for eof
+ num = driver(lines[processors-1], (alignFileName + toString(processors-1) + ".temp"), (reportFileName + toString(processors-1) + ".temp"), (accnosFName + toString(processors-1) + ".temp"), filename);
+
+ //Wait until all threads have terminated.
+ WaitForMultipleObjects(processors-1, hThreadArray, TRUE, INFINITE);
+
+ //Close all thread handles and free memory allocations.
+ for(int i=0; i < pDataArray.size(); i++){
+ num += pDataArray[i]->count;
+ CloseHandle(hThreadArray[i]);
+ delete pDataArray[i];
+ }
+
+ vector<string> nonBlankAccnosFiles;
+ if (!(m->isBlank(accnosFName))) { nonBlankAccnosFiles.push_back(accnosFName); }
+ else { m->mothurRemove(accnosFName); } //remove so other files can be renamed to it
+
+ for (int i = 1; i < processors; i++) {
+ appendAlignFiles((alignFileName + toString(i) + ".temp"), alignFileName);
+ m->mothurRemove((alignFileName + toString(i) + ".temp"));
+
+ appendReportFiles((reportFileName + toString(i) + ".temp"), reportFileName);
+ m->mothurRemove((reportFileName + toString(i) + ".temp"));
+
+ if (!(m->isBlank(accnosFName + toString(i) + ".temp"))) {
+ nonBlankAccnosFiles.push_back(accnosFName + toString(i) + ".temp");
+ }else { m->mothurRemove((accnosFName + toString(i) + ".temp")); }
+ }
+
+ //append accnos files
+ if (nonBlankAccnosFiles.size() != 0) {
+ rename(nonBlankAccnosFiles[0].c_str(), accnosFName.c_str());
+
+ for (int h=1; h < nonBlankAccnosFiles.size(); h++) {
+ appendAlignFiles(nonBlankAccnosFiles[h], accnosFName);
+ m->mothurRemove(nonBlankAccnosFiles[h]);
+ }
+ }else { //recreate the accnosfile if needed
+ ofstream out;
+ m->openOutputFile(accnosFName, out);
+ out.close();
+ }
+#endif